From 9e3335d1a0ebe863c7b12293ea59eb9c39ca1c5c Mon Sep 17 00:00:00 2001 From: Roland Mas Date: Mon, 26 Mar 2012 08:59:28 +0000 Subject: [PATCH] Merged from Evolvis: better DB query tracing --- src/common/include/database-pgsql.php | 12 +- src/common/include/extras-debug.php | 178 +++++++++++++++++--------- 2 files changed, 120 insertions(+), 70 deletions(-) diff --git a/src/common/include/database-pgsql.php b/src/common/include/database-pgsql.php index 8fa377f888..e26ca7583e 100644 --- a/src/common/include/database-pgsql.php +++ b/src/common/include/database-pgsql.php @@ -173,13 +173,13 @@ function db_query_from_file($file,$limit='-1',$offset=0,$dbserver=NULL) { $qstring = file_get_contents($file); if (!$qstring) { if ($sysdebug_dbquery) { - ffDebug("warning", + ffDebug("database", "aborted call of db_query_from_file():", "Cannot read file: " . $file . "\n\n" . debug_string_backtrace()); } else if ($sysdebug_dberrors) { - ffDebug("warning", "db_query_from_file() aborted (" . - "Cannot read file: " . $file . ")", false); + ffDebug("database", "db_query_from_file() aborted (" . + "Cannot read file: " . $file . ")"); } else { error_log("db_query_from_file(): Cannot read file: " . $file); } @@ -202,7 +202,7 @@ function db_query_from_file($file,$limit='-1',$offset=0,$dbserver=NULL) { $qstring, debug_string_backtrace()); } } else if ($sysdebug_dbquery || $sysdebug_dberrors) { - ffDebug("warning", "db_query_from_file() failed (" . + ffDebug("database", "db_query_from_file() failed (" . db_error($dbserver) . "), SQL: " . $qstring, $sysdebug_dbquery ? debug_string_backtrace() : false); } else { @@ -249,10 +249,10 @@ function db_query_params($qstring, $params, $limit = '-1', $offset = 0, $dbserve debug_string_backtrace()); } } else if ($sysdebug_dbquery) { - ffDebug("warning", "failed call of db_query_params():", + ffDebug("database", "failed call of db_query_params():", db_error($dbserver) . "\n\n" . debug_string_backtrace()); } else if ($sysdebug_dberrors) { - ffDebug("warning", "db_query_params() failed (" . + ffDebug("database", "db_query_params() failed (" . db_error($dbserver) . "), SQL: " . $qstring, print_r(array("params" => $params), 1)); } else { diff --git a/src/common/include/extras-debug.php b/src/common/include/extras-debug.php index dfe451fa09..501a953e52 100644 --- a/src/common/include/extras-debug.php +++ b/src/common/include/extras-debug.php @@ -1,14 +1,15 @@ ignore */ return false; + } $msg = "[$errno] $errstr ($errfile at $errline)"; - // Display messages only once. + // display messages only once foreach ($ffErrors as $m) { - if ($m['message'] == $msg) + if ($m['message'] == $msg) { return true; + } } switch ($errno) { - case E_USER_ERROR: - case E_ERROR: - $type = 'error'; - break; - - case E_USER_WARNING: - case E_WARNING: - $type = 'warning'; - break; - - case E_USER_NOTICE: - case E_NOTICE: - $type = 'notice'; - break; - - case E_STRICT: - case E_USER_DEPRECATED: - case E_DEPRECATED: - $type = "strict"; - break; - - default: - $type = 'unknown'; - break; + case E_USER_ERROR: + case E_ERROR: + $type = 'error'; + break; + + case E_USER_WARNING: + case E_WARNING: + $type = 'warning'; + break; + + case E_USER_NOTICE: + case E_NOTICE: + $type = 'notice'; + break; + + case E_STRICT: + case E_USER_DEPRECATED: + case E_DEPRECATED: + $type = "strict"; + break; + + default: + $type = 'unknown'; + break; } - if (forge_get_config('sysdebug_backtraces')) + if (forge_get_config('sysdebug_backtraces')) { $msg .= "\n" . '
' .
 		    htmlentities(debug_string_backtrace()) . "
"; + } - $ffErrors[] = array('type' => $type, 'message' => $msg); + $ffErrors[] = array( + 'type' => $type, + 'message' => $msg, + ); /* Don't execute PHP internal error handler */ return true; } - +// output buffer finaliser function function ffOutputHandler($buffer) { global $ffErrors, $sysdebug_enable, $sysdebug__aborted, $sysdebug_lazymode_on, $sysdebug_doframe, $gfcommon, @@ -82,19 +89,22 @@ function ffOutputHandler($buffer) { } /* in case we’re aborted */ - if (!$sysdebug_enable) + if (!$sysdebug_enable) { return $buffer; + } /* if content-type != text/html* assume abortion */ if ($sysdebug_lazymode_on) { $thdr = 'content-type:'; $tstr = 'content-type: text/html'; foreach (headers_list() as $h) { - if (strncasecmp($h, $thdr, strlen($thdr))) + if (strncasecmp($h, $thdr, strlen($thdr))) { continue; - if (strncasecmp($h, $tstr, strlen($tstr))) + } + if (strncasecmp($h, $tstr, strlen($tstr))) { /* application/something, maybe */ return $buffer; + } } } @@ -120,8 +130,7 @@ function ffOutputHandler($buffer) { 'Click to toggle' . "\n
"; - $doctype = util_ifsetor($HTML->doctype); - if (!$doctype) { + if (!($doctype = util_ifsetor($HTML->doctype))) { $doctype = 'transitional'; } @@ -139,25 +148,33 @@ function ffOutputHandler($buffer) { $bufend = array(false, substr($buffer, -100)); if (substr($buffer, -strlen("")) != "") { $bufend[0] = true; - $ffErrors[] = array('type' => "error", - 'message' => htmlentities("does not end with tag")); + $ffErrors[] = array( + 'type' => "error", + 'message' => htmlentities("does not end with tag"), + ); $buffer = str_ireplace("", "", $buffer); - } else + } else { $buffer = substr($buffer, 0, -strlen("")); + } $buffer = rtrim($buffer); /* spaces, newlines, etc. */ if (substr($buffer, -strlen("")) != "") { $bufend[0] = true; - $ffErrors[] = array('type' => "error", - 'message' => htmlentities("does not end with tag")); + $ffErrors[] = array( + 'type' => "error", + 'message' => htmlentities("does not end with tag"), + ); $buffer = str_ireplace("", "", $buffer); - } else + } else { $buffer = substr($buffer, 0, -strlen("")); + } $buffer = rtrim($buffer); /* spaces, newlines, etc. */ if ($bufend[0]) { - $ffErrors[] = array('type' => "info", - 'message' => "The output has ended thus: " . - htmlentities($bufend[1])); + $ffErrors[] = array( + 'type' => "info", + 'message' => "The output has ended thus: " . + htmlentities($bufend[1]), + ); } /* append errors, if any */ @@ -174,8 +191,9 @@ function ffOutputHandler($buffer) { /* generate buffer for checking */ $cbuf = str_ireplace('http://www.w3.org/TR/xhtml1/DTD/', 'file://' . $dtdpath, $buffer); - if ($has_div) + if ($has_div) { $cbuf .= "\n
"; + } $cbuf .= "\n\n"; /* now check XHTML validity… two means */ @@ -205,16 +223,18 @@ function ffOutputHandler($buffer) { $serr = join("\n", preg_grep( '/^-:[0-9]*: Entity'." 'nbsp' ".'not defined$/', explode("\n", $serr), PREG_GREP_INVERT)); - } else + } else { $valck[] = array( - 'msg' => "could not run xmlstarlet" + 'msg' => "could not run xmlstarlet", ); + } if ($rv) { $valck[] = array( 'msg' => "xmlstarlet found that this document is not valid (errorlevel $rv)!", - 'extra' => $pre_tag . htmlspecialchars(trim($serr . + 'extra' => $pre_tag . + htmlspecialchars(trim($serr . "\n\n" . $sout)) . "", - 'type' => "error" + 'type' => "error", ); $appsrc = true; } @@ -235,7 +255,7 @@ function ffOutputHandler($buffer) { $valck[] = array( 'msg' => "Akelos XHTML Validator found some errors on this document!", 'extra' => $errs, - 'type' => "error" + 'type' => "error", ); $appsrc = true; } @@ -243,14 +263,19 @@ function ffOutputHandler($buffer) { /* append XHTML source code, if validation failed */ if ($appsrc) { - if (!$sysdebug_akelos || $vbuf == $sbuf[1]) - $vbuf = "
  1. " . $pre_tag . join("
  2. \n
  3. " . $pre_tag, explode("\n", htmlentities(rtrim($cbuf)))) . "
"; - else - $vbuf = $pre_tag . htmlentities(rtrim($sbuf[0])) . "" . $vbuf; + if (!$sysdebug_akelos || $vbuf == $sbuf[1]) { + $vbuf = "
  1. " . $pre_tag . + join("
  2. \n
  3. " . $pre_tag, + explode("\n", htmlentities(rtrim($cbuf)))) . + "
"; + } else { + $vbuf = $pre_tag . htmlentities(rtrim($sbuf[0])) . + "" . $vbuf; + } $valck[] = array( 'msg' => "Since XHTML validation failed, here’s the checked document for you to look at:", 'extra' => $vbuf, - 'type' => 'normal' + 'type' => 'normal', ); } @@ -263,16 +288,19 @@ function ffOutputHandler($buffer) { if (!isset($msg['type']) || !$msg['type']) { $msg['type'] = 'unknown'; } - $buffer .= "\n
' . $msg['msg']; - if (isset($msg['extra'])) + $buffer .= "\n
' . + $msg['msg']; + if (isset($msg['extra'])) { $buffer .= "\n
" . $msg['extra'] . "
\n "; + } $buffer .= "
"; } /* return final buffer */ - if ($has_div) + if ($has_div) { $buffer .= "\n
"; + } if ($sysdebug_doframe) { return substr($buffer, $bufferstrip); } else { @@ -280,6 +308,7 @@ function ffOutputHandler($buffer) { } } +// exception handler function function ffExceptionHandler($e) { global $sysdebug__aborted; @@ -319,15 +348,36 @@ function sysdebug_ajaxbody($enable=true) { } function sysdebug_off($hdr=false, $replace=true, $resp=false) { - global $sysdebug_enable; + global $ffErrors, $sysdebug_enable; if ($sysdebug_enable) { $sysdebug_enable = false; - $buf = ob_get_flush(); + $buf = @ob_get_flush(); if ($buf === false) { $buf = ""; } + + /* if we had any old errors, log them */ + $olderrors = ""; + foreach ($ffErrors as $msg) { + $olderrors .= "\n(" . $msg['type'] . ") " . + $msg['message']; + } + if ($olderrors) { + if (!forge_get_config('sysdebug_backtraces')) { + $olderrors .= "\n" . debug_string_backtrace(); + } + $olderrors = rtrim($olderrors); + $pfx = ""; + foreach (explode("\n", + "sysdebug_off: previous errors found:" . $olderrors) + as $olderrorline) { + error_log($pfx . $olderrorline); + /* followup lines get indented */ + $pfx = ">>> "; + } + } } else { $buf = false; } @@ -349,7 +399,7 @@ function sysdebug_lazymode($enable) { $sysdebug_lazymode_on = $enable ? true : false; } -function ffDebug($type,$intro,$pretext) { +function ffDebug($type, $intro, $pretext=false) { global $ffErrors; if (!$type) { -- 2.30.2