List:Commits« Previous MessageNext Message »
From:ahristov Date:August 29 2007 9:58pm
Subject:PHP mysqlnd svn commit: r965 - trunk/mysqlnd
View as plain text  
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);

Thread
PHP mysqlnd svn commit: r965 - trunk/mysqlndahristov29 Aug