Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

PHP mysqlnd svn commit: r965 - trunk/mysqlnd

From: <ahristov(at)mysql.com>
Date: Wed Aug 29 2007 - 15:58:59 EDT


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) {
Do you need help?X
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);
Do you need more help?X
- 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;
 	
Can we help you?X

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)
Can't find what you're looking for?X
-#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)
Don't know where to look next?X
+#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

This archive was generated by hypermail 2.1.8 : Sun Oct 07 2007 - 08:57:05 EDT


Contact Us  Legal Notices  Order Services Online 
Pantek Home  Privacy Policy  IT news  Site Map  Pantek Library