Author: ahristov
Date: 2007-08-14 21:47:24 +0200 (Tue, 14 Aug 2007)
New Revision: 901
Modified:
trunk/mysqlnd/mysqlnd.c
trunk/mysqlnd/mysqlnd_wireprotocol.c
Log:
Less e_warnings...
Modified: trunk/mysqlnd/mysqlnd.c
- trunk/mysqlnd/mysqlnd.c 2007-08-14 19:46:27 UTC (rev 900)
+++ trunk/mysqlnd/mysqlnd.c 2007-08-14 19:47:24 UTC (rev 901)
@@ -66,6 +66,9 @@
MYSQLND_STATS *mysqlnd_global_stats = NULL;
static zend_bool mysqlnd_library_initted = FALSE;
+
+enum_func_status mysqlnd_send_close(MYSQLND * conn TSRMLS_DC);
+
/* {{{ mysqlnd_library_init */
static
void mysqlnd_library_init(zend_bool collect_statistics)
@@ -119,10 +122,13 @@
}
if (conn->net.stream) {
+ DBG_INF_FMT("Freeing stream. abstract=%p", conn->net.stream->abstract);
php_stream_free(conn->net.stream, (pers) ? PHP_STREAM_FREE_RSRC_DTOR :
PHP_STREAM_FREE_CLOSE);
conn->net.stream = NULL;
}
+
+ DBG_INF("Freeing memory of members");
if (conn->host) {
pefree(conn->host, pers);
conn->host = NULL;
@@ -200,14 +206,17 @@
conn->options.ssl_cipher = NULL;
}
if (conn->zval_cache) {
+ DBG_INF("Freeing zval cache reference");
mysqlnd_palloc_free_thd_cache_reference(&conn->zval_cache);
conn->zval_cache = NULL;
}
if (conn->qcache) {
+ DBG_INF("Freeing qcache reference");
mysqlnd_qcache_free_cache_reference(&conn->qcache);
conn->qcache = NULL;
}
if (conn->net.cmd_buffer.buffer) {
+ DBG_INF("Freeing cmd buffer");
pefree(conn->net.cmd_buffer.buffer, pers);
conn->net.cmd_buffer.buffer = NULL;
}
@@ -443,7 +452,7 @@
{
char *transport = NULL, *errstr = NULL;
char *hashed_details = NULL;
- int transport_len, errcode = 0;
+ int transport_len, hashed_details_len, errcode = 0;
unsigned int streams_options = ENFORCE_SAFE_MODE;
unsigned int streams_flags = STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT;
zend_bool self_alloced = FALSE;
@@ -456,14 +465,17 @@
php_mysql_packet_ok ok_packet;
DBG_ENTER("mysqlnd_connect");
- DBG_INF_FMT("host=%s user=%s db=%s port=%d flags=%d persistent=%d",
- host?host:"", user?user:"", db?db:"", port, mysql_flags, conn? conn->persistent:0);
+ DBG_INF_FMT("host=%s user=%s db=%s port=%d flags=%d persistent=%d state=%d",
+ host?host:"", user?user:"", db?db:"", port, mysql_flags,
+ conn? conn->persistent:0, conn? conn->state:-1);
- if (conn && conn->state != CONN_ALLOCED) {
- SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE,
- mysqlnd_out_of_sync);
- DBG_INF("Command out of sync");
- DBG_RETURN(NULL);
+ if (conn && conn->state > CONN_ALLOCED) {
+ MYSQLND_INC_CONN_STATISTIC(NULL, STAT_CLOSE_IMPLICIT);
+
+ mysqlnd_send_close(conn TSRMLS_CC);
+
+ conn->m->free_contents(conn TSRMLS_CC);
+ /* Now reconnect using the same handle */
}
if (!host || !host[0]) {
@@ -500,9 +512,9 @@
struct timeval tv;
gettimeofday(&tv, NULL);
/* We should generate something unique */
- spprintf(&hashed_details, 0, "%s@%s@%s@%ld@%ld@%0.8F",
- transport, user, db, tv.tv_sec, (long int)tv.tv_usec,
- php_combined_lcg(TSRMLS_C) * 10);
+ hashed_details_len = spprintf(&hashed_details, 0, "%s@%s@%s@%ld@%ld@%0.8F",
+ transport, user, db, tv.tv_sec, (long int)tv.tv_usec,
+ php_combined_lcg(TSRMLS_C) * 10);
DBG_INF_FMT("hashed_details=%s", hashed_details);
}
@@ -533,9 +545,30 @@
hashed_details,
(conn->options.timeout_connect) ? &tv : NULL,
NULL /*ctx*/, &errstr, &errcode);
+ DBG_INF_FMT("stream=%p", conn->net.stream);
+
if (hashed_details) {
+ /*
+ If persistent, the streams register it in EG(persistent_list).
+ This is unwanted. ext/mysql or ext/mysqli are responsible to clean,
+ whatever they have to.
+ */
+ zend_rsrc_list_entry *le;
+
+ if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_len + 1,
+ (void*) &le) == SUCCESS) {
+ /*
+ in_free will let streams code skip destructing - big HACK,
+ but STREAMS suck big time regarding persistent streams.
+ Just not compatible for extensions that need persistency.
+ */
+ conn->net.stream->in_free = 1;
+ zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_len + 1);
+ conn->net.stream->in_free = 0;
+ }
efree(hashed_details);
}
+
if (errstr || !conn->net.stream) {
goto err;
}
@@ -618,8 +651,8 @@
}
DBG_ERR_FMT("ERROR:%d [SQLSTATE:%s] %s",
ok_packet.error_no, ok_packet.sqlstate, ok_packet.error);
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "ERROR:%d [SQLSTATE:%s] %s PID=%d",
- ok_packet.error_no, ok_packet.sqlstate, ok_packet.error, getpid());
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "ERROR:%d [SQLSTATE:%s] %s",
+ ok_packet.error_no, ok_packet.sqlstate, ok_packet.error);
}
if (!self_alloced) {
conn->error_info.error_no = ok_packet.error_no;
@@ -670,7 +703,7 @@
conn->net.cmd_buffer.buffer = pemalloc(conn->net.cmd_buffer.length, conn->persistent);
MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_SUCCESS);
- DBG_INF_FMT("connection_id=%llu conn->net.stream->abstract=%p", conn->thread_id, conn->net.stream->abstract);
+ DBG_INF_FMT("connection_id=%llu", conn->thread_id);
{
uint as_unicode = 1;
conn->m->set_client_option(conn, MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE,
@@ -876,7 +909,7 @@
DBG_ENTER("mysqlnd_conn::ping");
DBG_INF_FMT("conn=%llu", conn->thread_id);
- ret = mysqlnd_simple_command(conn, COM_PING, NULL, 0, PROT_OK_PACKET, FALSE TSRMLS_CC);
+ ret = mysqlnd_simple_command(conn, COM_PING, NULL, 0, PROT_OK_PACKET, TRUE TSRMLS_CC);
/*
The server sends 0 but libmysql doesn't read it and has established
a protocol of giving back -1. Thus we have to follow it :(
@@ -1013,7 +1046,7 @@
/* {{{ mysqlnd_send_close */
-static enum_func_status
+enum_func_status
mysqlnd_send_close(MYSQLND * conn TSRMLS_DC)
{
enum_func_status ret = PASS;
@@ -1025,7 +1058,7 @@
case CONN_READY:
DBG_INF("Connection clean, sending COM_QUIT");
ret = mysqlnd_simple_command(conn, COM_QUIT, NULL, 0, PROT_LAST,
- conn->tmp_int? TRUE : FALSE TSRMLS_CC);
+ TRUE TSRMLS_CC);
/* Do nothing */
break;
case CONN_SENDING_LOAD_DATA:
Modified: trunk/mysqlnd/mysqlnd_wireprotocol.c
- trunk/mysqlnd/mysqlnd_wireprotocol.c 2007-08-14 19:46:27 UTC (rev 900)
+++ trunk/mysqlnd/mysqlnd_wireprotocol.c 2007-08-14 19:47:24 UTC (rev 901)
@@ -46,23 +46,17 @@
conn->state = CONN_QUIT_SENT; \
SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\
DBG_ERR_FMT("Can't read %s's header", (packet_type)); \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't read %s's header. PID=%d", \
- (packet_type), getpid());\
return FAIL;\
}\
if ((buf_size) < (packet)->header.size) { \
DBG_ERR_FMT("Packet buffer wasn't big enough %u bytes will be unread", \
(packet)->header.size - (buf_size)); \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Packet buffer wasn't big enough" \
- "%u bytes will be unread. PID=%d", \
- (packet)->header.size - (buf_size), getpid());\
}\
if (!mysqlnd_read_body((conn), (buf), \
MIN((buf_size), (packet)->header.size) TSRMLS_CC)) { \
conn->state = CONN_QUIT_SENT; \
SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\
DBG_ERR_FMT("Empty %s packet body", (packet_type)); \
- php_error(E_WARNING, "Empty %s packet body. PID=%d", (packet_type), getpid());\
return FAIL; \
} \
}
@@ -431,7 +425,6 @@
do {
if (!(ret= php_stream_read(net->stream, p, to_read))) {
DBG_ERR_FMT("Error while reading header from socket");
- php_error(E_WARNING, "Error while reading header from socket. PID=%d", getpid());
return FAIL;
}
p += ret;
@@ -883,6 +876,8 @@
/* Let's have some space, which we can use, if not enough, we will allocate new buffer */
php_mysql_packet_command *packet= (php_mysql_packet_command *) _packet;
MYSQLND_NET *net = &conn->net;
+ unsigned int error_reporting = EG(error_reporting);
+ size_t written;
DBG_ENTER("php_mysqlnd_cmd_write");
/*
@@ -891,6 +886,10 @@
*/
net->packet_no = 0;
+ if (error_reporting) {
+ zend_alter_ini_entry("error_reporting", sizeof("error_reporting"), "0", 1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
+ }
+
#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
php_mysqlnd_consume_uneaten_data(conn, packet->command TSRMLS_CC);
#endif
@@ -899,11 +898,11 @@
char buffer[MYSQLND_HEADER_SIZE + 1];
int1store(buffer + MYSQLND_HEADER_SIZE, packet->command);
- DBG_RETURN(mysqlnd_stream_write_w_header(conn, buffer, 1 TSRMLS_CC));
+ written = mysqlnd_stream_write_w_header(conn, buffer, 1 TSRMLS_CC);
} else {
#if USE_CORK && defined(TCP_CORK)
- DBG_RETURN(mysqlnd_stream_write_w_command(conn, packet->command, packet->argument,
- packet->arg_len TSRMLS_CC));
+ written = mysqlnd_stream_write_w_command(conn, packet->command, packet->argument,
+ packet->arg_len TSRMLS_CC));
#else
size_t tmp_len = packet->arg_len + 1 + MYSQLND_HEADER_SIZE, ret;
zend_uchar *tmp, *p;
@@ -920,9 +919,21 @@
MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CMD_BUFFER_TOO_SMALL);
efree(tmp);
}
- DBG_RETURN(ret);
+ written = ret;
#endif
}
+ if (error_reporting) {
+ /* restore error reporting */
+ zval tmp;
+ INIT_ZVAL(tmp);
+ Z_TYPE(tmp) = IS_LONG;
+ Z_LVAL(tmp) = error_reporting;
+ convert_to_string(&tmp);
+ zend_alter_ini_entry("error_reporting", sizeof("error_reporting"),
+ Z_STRVAL(tmp), Z_STRLEN(tmp), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
+ zval_dtor(&tmp);
+ }
+ DBG_RETURN(written);
}
/* }}} */
--
MySQL Code Commits Mailing List
For list archives:
http://lists.mysql.com/commits
To unsubscribe:
http://lists.mysql.com/commits?unsub=lists@pantek.com
Received on Tue Aug 14 15:47:31 2007