diff --git a/.gitattributes b/.gitattributes index c91bda02d35d9794f7144012f192fa19e8ca9e3e..12d74db7911d8015028798fa155109880edfb3b1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -394,6 +394,7 @@ ecrire/public/index.php -text ecrire/public/jointures.php -text ecrire/public/normaliser.php -text ecrire/public/quete.php -text +ecrire/public/tracer.php -text ecrire/req/pg.php -text ecrire/req/sqlite2.php -text ecrire/req/sqlite3.php -text diff --git a/ecrire/exec/brouteur_frame.php b/ecrire/exec/brouteur_frame.php index b9d5dbbe901097759a9c25293f14578b37736c20..2c65e02d30722df946929fac0be14f8e6ca3bdc6 100644 --- a/ecrire/exec/brouteur_frame.php +++ b/ecrire/exec/brouteur_frame.php @@ -241,7 +241,7 @@ function exec_brouteur_frame_dist() { } } if (count($GLOBALS['tableau_des_temps'])) { - include_spip('public/debug'); + include_spip('public/tracer'); echo chrono_requete($GLOBALS['tableau_des_temps']); } echo "</div>"; diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php index 46fb35de91659c44326442832cdbd73f2ec6e4f9..0b7d19a6c6996a785a4436e393c6c6efbd0962c2 100644 --- a/ecrire/inc/actions.php +++ b/ecrire/inc/actions.php @@ -206,7 +206,7 @@ function ajax_retour($corps,$xml = true) } else { if (isset($GLOBALS['tableau_des_temps'])) { - include_spip('public/debug'); + include_spip('public/tracer'); $fin = chrono_requete($GLOBALS['tableau_des_temps']); } else $fin = ''; diff --git a/ecrire/inc/presentation_mini.php b/ecrire/inc/presentation_mini.php index 894f305a2201dc5f03e51204c95fb6c237af990d..7fd8b1b03be4234afbb11a27cf550e317c2f52ce 100644 --- a/ecrire/inc/presentation_mini.php +++ b/ecrire/inc/presentation_mini.php @@ -324,7 +324,7 @@ function fin_page() // avec &var_profile=1 on a le tableau de mesures SQL if (@count($GLOBALS['tableau_des_temps'])) { - include_spip('public/debug'); + include_spip('public/tracer'); $chrono = chrono_requete($GLOBALS['tableau_des_temps']); } else $chrono = ''; diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php index 03e18588a1fb37235650115360ec0ea2d9ae91a3..98b4a369b1f3229e72e82be2419e5217dd7cec16 100644 --- a/ecrire/public/debug.php +++ b/ecrire/public/debug.php @@ -74,76 +74,6 @@ function affiche_erreurs_page($tableau_des_erreurs, $message='') { . "</table>"; } -// http://doc.spip.org/@chrono_requete -function chrono_requete($temps) -{ - $total = 0; - $hors = "<i>" . _T('zbug_hors_compilation') . "</i>"; - $t = $q = $n = $d = array(); - foreach ($temps as $key => $row) { - list($dt, $nb, $boucle, $query, $explain, $res) = $row; - $total += $dt; - $d[$boucle]+= $dt; - $t[$key] = $dt; - $q[$key] = $nb; - - $e = "<tr><th colspan='2' style='text-align:center'>" - . (!$boucle ? $hors : - ($boucle . ' (' . @++$n[$boucle] . ")")) - . "</th></tr>" - . "<tr><td>Time</td><td>$dt</td></tr>" - . "<tr><td>Order</td><td>$nb</td></tr>" - . "<tr><td>Res</td><td>$res</td></tr>" ; - - foreach($explain as $k => $v) { - $e .= "<tr><td>$k</td><td>" - . str_replace(';','<br />',$v) - . "</td></tr>"; - } - $e = "<br /><table border='1'>$e</table>"; - $temps[$key] = array($boucle, $e, $query); - } - array_multisort($t, SORT_DESC, $q, $temps); - arsort($d); - $i = 1; - $t = array(); - foreach($temps as $k => $v) { - $boucle = array_shift($v); - $temps[$k] = $v; - $x = "<a style='font-family: monospace' title='" - . textebrut(preg_replace(',</tr>,', "\n",$v[0])) - . "' href='".quote_amp($GLOBALS['REQUEST_URI'])."#req$i'>" - . str_replace(' ', ' ', sprintf("%5d",$i)) - . "</a>"; - if (count($t[$boucle]) % 30 == 29) $x .= "<br />"; - $t[$boucle][] = $x; - $i++; - } - - if ($d['']) { - $d[$hors] = $d['']; - $n[$hors] = $n['']; - $t[$hors] = $t['']; - } - unset($d['']); - foreach ($d as $k => $v) { - $d[$k] = $n[$k] . "</td><td>$k</td><td>$v</td><td>" - . join('',$t[$k]); - } - - $titre = '<br />' - . _T('zbug_statistiques') - . '<br />' - . "<table style='text-align: left; border: 1px solid;'><tr><td>" - . join("</td></tr>\n<tr><td>", $d) - . "</td></tr>\n" - . (_request('var_mode_objet') ? '' : - ("<tr><td>" . count($temps) . " </td><td> " . _T('info_total') . '</td><td>' . $total . "</td></td><td></td></tr>")) - . "</table>"; - - return (_DIR_RESTREINT ? '' : affiche_erreurs_page($GLOBALS['tableau_des_erreurs'])) - . affiche_erreurs_page($temps, $titre); -} // // Si une boucle cree des soucis, on peut afficher la requete fautive @@ -676,63 +606,4 @@ function count_occ($regs) return $encore; } -// http://doc.spip.org/@trace_query_start -function trace_query_start() -{ - static $trace = '?'; - if ($trace === '?') { - include_spip('inc/autoriser'); - // gare au bouclage sur calcul de droits au premier appel - // A fortiori quand on demande une trace - $trace = isset($_GET['var_profile']) AND (autoriser('debug')); - } - return $trace ? microtime() : 0; -} - -// http://doc.spip.org/@trace_query_end -function trace_query_end($query, $start, $result, $err, $serveur='') -{ - global $tableau_des_erreurs; - if ($start) - trace_query_chrono($start, microtime(), $query, $result, $serveur); - if (!($err = sql_errno())) return $result; - $err .= ' '.sql_error(); - if (autoriser('debug')) { - include_spip('public/debug'); - $tableau_des_erreurs[] = array( - _T('info_erreur_requete'). " " . htmlentities($query), - "« " . htmlentities($err)," »"); - } - return $result; -} - -// http://doc.spip.org/@trace_query_chrono -function trace_query_chrono($m1, $m2, $query, $result, $serveur='') -{ - static $tt = 0, $nb=0; - global $tableau_des_temps; - - $x = _request('var_mode_objet'); - if (isset($GLOBALS['debug']['aucasou'])) { - list(, $boucle, $serveur) = $GLOBALS['debug']['aucasou']; - if ($x AND !preg_match("/$boucle\$/", $x)) - return; - if ($serveur) $boucle .= " ($serveur)"; - $boucle = "<b>$boucle</b>"; - } else { - if ($x) return; - $boucle = ''; - } - - list($usec, $sec) = explode(" ", $m1); - list($usec2, $sec2) = explode(" ", $m2); - $dt = $sec2 + $usec2 - $sec - $usec; - $tt += $dt; - $nb++; - - $q = preg_replace('/([a-z)`])\s+([A-Z])/', '$1<br />$2',htmlentities($query)); - $e = sql_explain($query, $serveur); - $r = str_replace('Resource id ','',(is_object($result)?get_class($result):$result)); - $tableau_des_temps[] = array($dt, $nb, $boucle, $q, $e, $r); -} ?> diff --git a/ecrire/public/tracer.php b/ecrire/public/tracer.php new file mode 100644 index 0000000000000000000000000000000000000000..f7d547467ffc97d7845ce0095a84572a36afd80e --- /dev/null +++ b/ecrire/public/tracer.php @@ -0,0 +1,146 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2009 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +// http://doc.spip.org/@trace_query_start +function trace_query_start() +{ + static $trace = '?'; + if ($trace === '?') { + include_spip('inc/autoriser'); + // gare au bouclage sur calcul de droits au premier appel + // A fortiori quand on demande une trace + $trace = isset($_GET['var_profile']) AND (autoriser('debug')); + } + return $trace ? microtime() : 0; +} + +// http://doc.spip.org/@trace_query_end +function trace_query_end($query, $start, $result, $err, $serveur='') +{ + global $tableau_des_erreurs; + if ($start) + trace_query_chrono($start, microtime(), $query, $result, $serveur); + if (!($err = sql_errno())) return $result; + $err .= ' '.sql_error(); + if (autoriser('debug')) { + include_spip('public/debug'); + $tableau_des_erreurs[] = array( + _T('info_erreur_requete'). " " . htmlentities($query), + "« " . htmlentities($err)," »"); + } + return $result; +} + +// http://doc.spip.org/@trace_query_chrono +function trace_query_chrono($m1, $m2, $query, $result, $serveur='') +{ + static $tt = 0, $nb=0; + global $tableau_des_temps; + + $x = _request('var_mode_objet'); + if (isset($GLOBALS['debug']['aucasou'])) { + list(, $boucle, $serveur) = $GLOBALS['debug']['aucasou']; + if ($x AND !preg_match("/$boucle\$/", $x)) + return; + if ($serveur) $boucle .= " ($serveur)"; + $boucle = "<b>$boucle</b>"; + } else { + if ($x) return; + $boucle = ''; + } + + list($usec, $sec) = explode(" ", $m1); + list($usec2, $sec2) = explode(" ", $m2); + $dt = $sec2 + $usec2 - $sec - $usec; + $tt += $dt; + $nb++; + + $q = preg_replace('/([a-z)`])\s+([A-Z])/', '$1<br />$2',htmlentities($query)); + $e = sql_explain($query, $serveur); + $r = str_replace('Resource id ','',(is_object($result)?get_class($result):$result)); + $tableau_des_temps[] = array($dt, $nb, $boucle, $q, $e, $r); +} + + +function chrono_requete($temps) +{ + $total = 0; + $hors = "<i>" . _T('zbug_hors_compilation') . "</i>"; + $t = $q = $n = $d = array(); + foreach ($temps as $key => $row) { + list($dt, $nb, $boucle, $query, $explain, $res) = $row; + $total += $dt; + $d[$boucle]+= $dt; + $t[$key] = $dt; + $q[$key] = $nb; + + $e = "<tr><th colspan='2' style='text-align:center'>" + . (!$boucle ? $hors : + ($boucle . ' (' . @++$n[$boucle] . ")")) + . "</th></tr>" + . "<tr><td>Time</td><td>$dt</td></tr>" + . "<tr><td>Order</td><td>$nb</td></tr>" + . "<tr><td>Res</td><td>$res</td></tr>" ; + + foreach($explain as $k => $v) { + $e .= "<tr><td>$k</td><td>" + . str_replace(';','<br />',$v) + . "</td></tr>"; + } + $e = "<br /><table border='1'>$e</table>"; + $temps[$key] = array($boucle, $e, $query); + } + array_multisort($t, SORT_DESC, $q, $temps); + arsort($d); + $i = 1; + $t = array(); + foreach($temps as $k => $v) { + $boucle = array_shift($v); + $temps[$k] = $v; + $x = "<a style='font-family: monospace' title='" + . textebrut(preg_replace(',</tr>,', "\n",$v[0])) + . "' href='".quote_amp($GLOBALS['REQUEST_URI'])."#req$i'>" + . str_replace(' ', ' ', sprintf("%5d",$i)) + . "</a>"; + if (count($t[$boucle]) % 30 == 29) $x .= "<br />"; + $t[$boucle][] = $x; + $i++; + } + + if ($d['']) { + $d[$hors] = $d['']; + $n[$hors] = $n['']; + $t[$hors] = $t['']; + } + unset($d['']); + foreach ($d as $k => $v) { + $d[$k] = $n[$k] . "</td><td>$k</td><td>$v</td><td>" + . join('',$t[$k]); + } + + $titre = '<br />' + . _T('zbug_statistiques') + . '<br />' + . "<table style='text-align: left; border: 1px solid;'><tr><td>" + . join("</td></tr>\n<tr><td>", $d) + . "</td></tr>\n" + . (_request('var_mode_objet') ? '' : + ("<tr><td>" . count($temps) . " </td><td> " . _T('info_total') . '</td><td>' . $total . "</td></td><td></td></tr>")) + . "</table>"; + + return (_DIR_RESTREINT ? '' : affiche_erreurs_page($GLOBALS['tableau_des_erreurs'])) + . affiche_erreurs_page($temps, $titre); +} + +?> diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index ab6713bc0fc637cfe251ffe2bd6b407ae0094fa0..983f3f94c91631adf48a1e6978e84855f3f5ec56 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -124,7 +124,11 @@ function spip_mysql_query($query, $serveur='',$requeter=true) { // renvoyer la requete inerte si demandee if (!$requeter) return $query; - $t = !isset($_GET['var_profile']) ? 0 : trace_query_start(); + if (isset($_GET['var_profile'])) { + include_spip('public/tracer'); + $t = trace_query_start(); + } else $t = 0 ; + $r = $link ? mysql_query($query, $link) : mysql_query($query); if ($e = spip_mysql_errno()) // Log de l'erreur eventuelle @@ -548,7 +552,11 @@ function spip_mysql_insert($table, $champs, $valeurs, $desc='', $serveur='',$req if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table); - $t = !isset($_GET['var_profile']) ? 0 : trace_query_start(); + if (isset($_GET['var_profile'])) { + include_spip('public/tracer'); + $t = trace_query_start(); + } else $t = 0 ; + $query="INSERT INTO $table $champs VALUES $valeurs"; # spip_log($query); if (mysql_query($query, $link)) diff --git a/ecrire/req/pg.php b/ecrire/req/pg.php index cfffeb9c4c9d1cc40d837c8fb1ed837a0469cd27..d4b647fcf76d33cf14aa04414436d228594ff8e5 100644 --- a/ecrire/req/pg.php +++ b/ecrire/req/pg.php @@ -111,7 +111,11 @@ function spip_pg_trace_query($query, $serveur='') $link = $connexion['link']; $db = $connexion['db']; - $t = !isset($_GET['var_profile']) ? 0 : trace_query_start(); + if (isset($_GET['var_profile'])) { + include_spip('public/tracer'); + $t = trace_query_start(); + } else $t = 0 ; + $r = spip_pg_query_simple($link, $query); if ($e = spip_pg_errno()) // Log de l'erreur eventuelle diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php index c30e5dafc21536dcdcab5df330c836cb01ef2e90..084f87d87ddb276770abcf09c3e9eedcdb5d6abf 100644 --- a/ecrire/req/sqlite_generique.php +++ b/ecrire/req/sqlite_generique.php @@ -685,8 +685,11 @@ function spip_sqlite_insert($table, $champs, $valeurs, $desc='', $serveur='',$re if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table); - $t = !isset($_GET['var_profile']) ? 0 : trace_query_start(); - + if (isset($_GET['var_profile'])) { + include_spip('public/tracer'); + $t = trace_query_start(); + } else $t = 0 ; + $query="INSERT OR REPLACE INTO $table $champs VALUES $valeurs"; if (!$requeter) return $query; @@ -1596,7 +1599,11 @@ class sqlite_traiter_requete{ // faire le tracage si demande // http://doc.spip.org/@executer_requete function executer_requete(){ - $t = $this->tracer ? trace_query_start(): 0; + if ($this->tracer) { + include_spip('public/tracer'); + $t = trace_query_start(); + } else $t = 0 ; + # spip_log("requete: $this->serveur >> $this->query",'query'); // boum ? pourquoi ? if ($this->link){ if ($this->sqlite_version == 3) {