Author: ahristov
Date: 2007-08-29 21:58:58 +0200 (Wed, 29 Aug 2007)
New Revision: 965
Modified:
trunk/mysqlnd/mysqlnd_debug.c
trunk/mysqlnd/mysqlnd_debug.h
trunk/mysqlnd/mysqlnd_wireprotocol.c
Log:
Improved DBG code. "f" now works, even with function
names with :: in them. "t" also works.
Modified: trunk/mysqlnd/mysqlnd_debug.c
- trunk/mysqlnd/mysqlnd_debug.c 2007-08-29 18:27:45 UTC (rev 964)
+++ trunk/mysqlnd/mysqlnd_debug.c 2007-08-29 19:58:58 UTC (rev 965)
@@ -76,7 +76,7 @@
size_t message_line_len;
unsigned int flags = self->flags;
char pid_buffer[10], time_buffer[30], file_buffer[200],
- line_buffer[6], level_buffer[6];
+ line_buffer[6], level_buffer[7];
if (!self->stream) {
if (FAIL == self->m->open(self, FALSE)) {
@@ -97,7 +97,8 @@
if (flags & MYSQLND_DEBUG_DUMP_PID) {
- snprintf(pid_buffer, sizeof(pid_buffer), "%5u: ", self->pid);
+ snprintf(pid_buffer, sizeof(pid_buffer) - 1, "%5u: ", self->pid);
+ pid_buffer[sizeof(pid_buffer) - 1 ] = '\0';
}
if (flags & MYSQLND_DEBUG_DUMP_TIME) {
/* The following from FF's DBUG library, which is in the public domain */
@@ -106,35 +107,39 @@
in system ticks, 10 ms intervals. See my_getsystime.c for high res */
SYSTEMTIME loc_t;
GetLocalTime(&loc_t);
- snprintf(time_buffer, sizeof(time_buffer),
+ snprintf(time_buffer, sizeof(time_buffer) - 1,
/* "%04d-%02d-%02d " */
"%02d:%02d:%02d.%06d ",
/*tm_p->tm_year + 1900, tm_p->tm_mon + 1, tm_p->tm_mday,*/,
loc_t.wHour, loc_t.wMinute, loc_t.wSecond, loc_t.wMilliseconds);
+ time_buffer[sizeof(time_buffer) - 1 ] = '\0';
#else
struct timeval tv;
struct tm *tm_p;
if (gettimeofday(&tv, NULL) != -1) {
if ((tm_p= localtime((const time_t *)&tv.tv_sec))) {
- snprintf(time_buffer, sizeof(time_buffer),
+ snprintf(time_buffer, sizeof(time_buffer) - 1,
/* "%04d-%02d-%02d " */
"%02d:%02d:%02d.%06d ",
/*tm_p->tm_year + 1900, tm_p->tm_mon + 1, tm_p->tm_mday,*/
tm_p->tm_hour, tm_p->tm_min, tm_p->tm_sec,
(int) (tv.tv_usec));
+ time_buffer[sizeof(time_buffer) - 1 ] = '\0';
}
}
#endif
-
}
if (flags & MYSQLND_DEBUG_DUMP_FILE) {
- snprintf(file_buffer, sizeof(file_buffer), "%14s: ", file);
+ snprintf(file_buffer, sizeof(file_buffer) - 1, "%14s: ", file);
+ file_buffer[sizeof(file_buffer) - 1 ] = '\0';
}
if (flags & MYSQLND_DEBUG_DUMP_LINE) {
- snprintf(line_buffer, sizeof(line_buffer), "%5u: ", line);
+ snprintf(line_buffer, sizeof(line_buffer) - 1, "%5u: ", line);
+ line_buffer[sizeof(line_buffer) - 1 ] = '\0';
}
if (flags & MYSQLND_DEBUG_DUMP_LEVEL) {
- snprintf(level_buffer, sizeof(level_buffer), "%4u: ", level);
+ snprintf(level_buffer, sizeof(level_buffer) - 1, "%4u: ", level);
+ level_buffer[sizeof(level_buffer) - 1 ] = '\0';
}
message_line_len = spprintf(&message_line, 0, "%s%s%s%s%s%s%s%s\n",
@@ -172,7 +177,7 @@
va_list args;
unsigned int flags = self->flags;
char pid_buffer[10], time_buffer[30], file_buffer[200],
- line_buffer[6], level_buffer[6];
+ line_buffer[6], level_buffer[7];
if (!self->stream) {
if (FAIL == self->m->open(self, FALSE)) {
@@ -193,7 +198,8 @@
if (flags & MYSQLND_DEBUG_DUMP_PID) {
- snprintf(pid_buffer, sizeof(pid_buffer), "%5u: ", self->pid);
+ snprintf(pid_buffer, sizeof(pid_buffer) - 1, "%5u: ", self->pid);
+ pid_buffer[sizeof(pid_buffer) - 1 ] = '\0';
}
if (flags & MYSQLND_DEBUG_DUMP_TIME) {
/* The following from FF's DBUG library, which is in the public domain */
@@ -202,34 +208,39 @@
in system ticks, 10 ms intervals. See my_getsystime.c for high res */
SYSTEMTIME loc_t;
GetLocalTime(&loc_t);
- snprintf(time_buffer, sizeof(time_buffer),
+ snprintf(time_buffer, sizeof(time_buffer) - 1,
/* "%04d-%02d-%02d " */
"%02d:%02d:%02d.%06d ",
/*tm_p->tm_year + 1900, tm_p->tm_mon + 1, tm_p->tm_mday,*/,
loc_t.wHour, loc_t.wMinute, loc_t.wSecond, loc_t.wMilliseconds);
+ time_buffer[sizeof(time_buffer) - 1 ] = '\0';
#else
struct timeval tv;
struct tm *tm_p;
if (gettimeofday(&tv, NULL) != -1) {
if ((tm_p= localtime((const time_t *)&tv.tv_sec))) {
- snprintf(time_buffer, sizeof(time_buffer),
+ snprintf(time_buffer, sizeof(time_buffer) - 1,
/* "%04d-%02d-%02d " */
"%02d:%02d:%02d.%06d ",
/*tm_p->tm_year + 1900, tm_p->tm_mon + 1, tm_p->tm_mday,*/
tm_p->tm_hour, tm_p->tm_min, tm_p->tm_sec,
(int) (tv.tv_usec));
+ time_buffer[sizeof(time_buffer) - 1 ] = '\0';
}
}
#endif
}
if (flags & MYSQLND_DEBUG_DUMP_FILE) {
- snprintf(file_buffer, sizeof(file_buffer), "%14s: ", file);
+ snprintf(file_buffer, sizeof(file_buffer) - 1, "%14s: ", file);
+ file_buffer[sizeof(file_buffer) - 1 ] = '\0';
}
if (flags & MYSQLND_DEBUG_DUMP_LINE) {
- snprintf(line_buffer, sizeof(line_buffer), "%5u: ", line);
+ snprintf(line_buffer, sizeof(line_buffer) - 1, "%5u: ", line);
+ line_buffer[sizeof(line_buffer) - 1 ] = '\0';
}
if (flags & MYSQLND_DEBUG_DUMP_LEVEL) {
- snprintf(level_buffer, sizeof(level_buffer), "%4u: ", level);
+ snprintf(level_buffer, sizeof(level_buffer) - 1, "%4u: ", level);
+ level_buffer[sizeof(level_buffer) - 1 ] = '\0';
}
@@ -257,16 +268,26 @@
}
/* }}} */
-
+/* FALSE */
/* {{{ mysqlnd_res_meta::func_enter */
-static enum_func_status
+static zend_bool
MYSQLND_METHOD(mysqlnd_debug, func_enter)(MYSQLND_DEBUG * self,
unsigned int line, const char * const file,
char * func_name, size_t func_name_len)
{
+ if (zend_stack_count(&self->call_stack) >= self->nest_level_limit) {
+ return FALSE;
+ }
zend_stack_push(&self->call_stack, func_name, func_name_len + 1);
+
+ if (zend_hash_num_elements(&self->not_filtered_functions) &&
+ 0 == zend_hash_exists(&self->not_filtered_functions, func_name, strlen(func_name) + 1))
+ {
+ return FALSE;
+ }
+
self->m->log_va(self, line, file, zend_stack_count(&self->call_stack) - 1, NULL, ">%s", func_name);
- return PASS;
+ return TRUE;
}
/* }}} */
@@ -278,7 +299,12 @@
{
char *func_name;
zend_stack_top(&self->call_stack, (void **)&func_name);
- self->m->log_va(self, line, file, zend_stack_count(&self->call_stack) - 1, NULL, "<%s", func_name);
+
+ if (!zend_hash_num_elements(&self->not_filtered_functions) ||
+ 1 == zend_hash_exists(&self->not_filtered_functions, func_name, strlen(func_name) + 1))
+ {
+ self->m->log_va(self, line, file, zend_stack_count(&self->call_stack) - 1, NULL, "<%s", func_name);
+ }
return zend_stack_del_top(&self->call_stack) == SUCCESS? PASS:FAIL;
}
/* }}} */
@@ -307,6 +333,7 @@
self->file_name = NULL;
}
zend_stack_destroy(&self->call_stack);
+ zend_hash_destroy(&self->not_filtered_functions);
efree(self);
return PASS;
}
@@ -329,11 +356,15 @@
enum mysqlnd_debug_parser_state state = PARSER_WAIT_MODIFIER;
self->flags = 0;
- self->nest_level_limit = (unsigned int) ~0;
+ self->nest_level_limit = 0;
if (self->file_name && self->file_name != mysqlnd_debug_default_trace_file) {
efree(self->file_name);
self->file_name = (char *) mysqlnd_debug_default_trace_file;
}
+ if (zend_hash_num_elements(&self->not_filtered_functions)) {
+ zend_hash_destroy(&self->not_filtered_functions);
+ zend_hash_init(&self->not_filtered_functions, 0, NULL, NULL, 0);
+ }
for (i = 0; i < mode_len; i++) {
switch (mode[i]) {
@@ -366,9 +397,44 @@
}
state = PARSER_WAIT_MODIFIER;
break;
+ case 'f': /* limit output to these functions */
+ if (mode[i+1] == ',') {
+ unsigned int j = i + 2;
+ i++;
+ while (j < mode_len) {
+ if (mode[j] == ':') {
+ /* function names with :: */
+ if ((j + 1 < mode_len) && mode[j+1] == ':') {
+ j += 2;
+ continue;
+ }
+ }
+ if (mode[j] == ',' || mode[j] == ':') {
+ if (j > i + 2) {
+ char func_name[1024];
+ size_t func_name_len = MIN(sizeof(func_name) - 1, j - i - 1);
+ memcpy(func_name, mode + i + 1, func_name_len);
+ func_name[func_name_len] = '\0';
+
+ zend_hash_add_empty_element(&self->not_filtered_functions,
+ func_name, func_name_len + 1);
+ i = j;
+ }
+ if (mode[j] == ':') {
+ break;
+ }
+ }
+ j++;
+ }
+ i = j;
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
+ "Expected list of functions for '%c' found none", mode[i]);
+ }
+ state = PARSER_WAIT_COLON;
+ break;
+ case 'D':
case 'd':
- case 'D':
- case 'f':
case 'g':
case 'p':
/* unsupported */
@@ -416,6 +482,7 @@
i = j;
} else {
self->flags |= MYSQLND_DEBUG_DUMP_TRACE;
+ self->nest_level_limit = 200; /* default value for FF DBUG */
}
state = PARSER_WAIT_COLON;
break;
@@ -463,9 +530,10 @@
#ifdef ZTS
ret->TSRMLS_C = TSRMLS_C;
#endif
- ret->nest_level_limit = (unsigned int) ~0;
+ ret->nest_level_limit = 0;
ret->pid = getpid();
zend_stack_init(&ret->call_stack);
+ zend_hash_init(&ret->not_filtered_functions, 0, NULL, NULL, 0);
ret->m = & mysqlnd_mysqlnd_debug_methods;
Modified: trunk/mysqlnd/mysqlnd_debug.h
- trunk/mysqlnd/mysqlnd_debug.h 2007-08-29 18:27:45 UTC (rev 964)
+++ trunk/mysqlnd/mysqlnd_debug.h 2007-08-29 19:58:58 UTC (rev 965)
@@ -35,8 +35,8 @@
unsigned int level, const char * type, const char *message);
enum_func_status (*log_va)(MYSQLND_DEBUG *self, unsigned int line, const char * const file,
unsigned int level, const char * type, const char *format, ...);
- enum_func_status (*func_enter)(MYSQLND_DEBUG *self, unsigned int line, const char * const file,
- char * func_name, size_t func_name_len);
+ zend_bool (*func_enter)(MYSQLND_DEBUG *self, unsigned int line, const char * const file,
+ char * func_name, size_t func_name_len);
enum_func_status (*func_leave)(MYSQLND_DEBUG *self, unsigned int line, const char * const file);
enum_func_status (*close)(MYSQLND_DEBUG *self);
enum_func_status (*free)(MYSQLND_DEBUG *self);
@@ -53,6 +53,7 @@
int pid;
char * file_name;
zend_stack call_stack;
+ HashTable not_filtered_functions;
struct st_mysqlnd_debug_methods *m;
};
@@ -74,14 +75,14 @@
void _mysqlnd_free(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
#if PHP_DEBUG && !defined(PHP_WIN32)
-#define DBG_INF(msg) do { if(MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0)
-#define DBG_ERR(msg) do { if(MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0)
-#define DBG_INF_FMT(...) do { if(MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0)
-#define DBG_ERR_FMT(...) do { if(MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0)
+#define DBG_INF(msg) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0)
+#define DBG_ERR(msg) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0)
+#define DBG_INF_FMT(...) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0)
+#define DBG_ERR_FMT(...) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0)
-#define DBG_ENTER(func_name) do { if(MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_enter(MYSQLND_G(dbg), __LINE__, __FILE__, func_name, sizeof(func_name) - 1); } while (0)
-#define DBG_RETURN(value) do { if(MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return (value); } while (0)
-#define DBG_VOID_RETURN do { if(MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return; } while (0)
+#define DBG_ENTER(func_name) zend_bool dbg_skip_trace = TRUE; if (MYSQLND_G(dbg)) dbg_skip_trace = !MYSQLND_G(dbg)->m->func_enter(MYSQLND_G(dbg), __LINE__, __FILE__, func_name, sizeof(func_name) - 1);
+#define DBG_RETURN(value) do { if (MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return (value); } while (0)
+#define DBG_VOID_RETURN do { if (MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return; } while (0)
Modified: trunk/mysqlnd/mysqlnd_wireprotocol.c
- trunk/mysqlnd/mysqlnd_wireprotocol.c 2007-08-29 18:27:45 UTC (rev 964)
+++ trunk/mysqlnd/mysqlnd_wireprotocol.c 2007-08-29 19:58:58 UTC (rev 965)
@@ -429,7 +429,9 @@
#endif
do {
if (!(ret= php_stream_read(net->stream, p, to_read))) {
+#if !MYSQLND_SILENT
DBG_ERR_FMT("Error while reading header from socket");
+#endif
return FAIL;
}
p += ret;
@@ -461,8 +463,10 @@
#endif
}
+#if !MYSQLND_SILENT
DBG_ERR_FMT("Packets out of order. Expected %d received %d. Packet size=%d",
net->packet_no, header->packet_no, header->size);
+#endif
php_error(E_WARNING, "Packets out of order. Expected %d received %d. Packet size=%d. PID=%d",
net->packet_no, header->packet_no, header->size, getpid());
#if !MYSQLND_SILENT
@@ -496,8 +500,10 @@
do {
size -= (ret = php_stream_read(net->stream, p, size));
if (size || iter++) {
+#if !MYSQLND_SILENT
DBG_INF_FMT("read=%d buf=%p p=%p chunk_size=%d left=%d",
ret, buf, p , net->stream->chunk_size, size);
+#endif
}
p += ret;
} while (size > 0);
--
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 Wed Aug 29 15:59:59 2007