Valider 91f34232 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Log des erreurs SQL pour faciliter grandement le debug :

- loger le fichier et la ligne qui a cause l'erreur (l'appelant de la fonction sql_xxx), et la cascade des fonctions appelantes
- dans le tableau des erreurs afficher aussi le nom du fichier, la ligne et la fonction appelante
- ne pas loger deux fois de suite la meme erreur (la fonction spip_mysql_error qui appelle sql_error pour avoir le message qui elle meme logait pour rien)

(kudo au log des erreurs sql wordpress et a fil qui me l'a montre)
parent 6258577a
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+31 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -30,6 +30,35 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
define('sql_ABSTRACT_VERSION', 1);
include_spip('base/connect_sql');

function sql_error_backtrace($compil_info = false){
	$trace = debug_backtrace();
	$caller = array_shift($trace);
	while (count($trace) AND ($trace[0]['file']===$caller['file'] OR $trace[0]['file']===__FILE__))
		array_shift($trace);

	if ($compil_info){
		$contexte_compil = array(
			$trace[0]['file'],// sourcefile
			'', //nom
			$trace[1]['function']."(){\n".$trace[0]['function']."();\n}", //id_boucle
			$trace[0]['line'], // ligne
			$GLOBALS['spip_lang'], // lang
		);
		return $contexte_compil;
	}
	$message = $trace[0]['file']." L".$trace[0]['line'];
	$f = array();
	while(count($trace) AND $t=array_shift($trace)){
		if (in_array($t['function'],array('include_once','include_spip','find_in_path')))
			break;
		$f[] = $t['function'];
	}
	if (count($f))
		$message .= " [".implode("(),",$f)."()]";

	return $message;
}



/**
@@ -195,7 +224,8 @@ function sql_select ($select = array(), $from = array(), $where = array(),
	// denoncer l'erreur SQL dans sa version brute
	spip_sql_erreur($serveur);
	// idem dans sa version squelette (prefixe des tables non substitue)
	erreur_squelette(array(sql_errno($serveur), sql_error($serveur), $res), $option);
	$contexte_compil = sql_error_backtrace(true);
	erreur_squelette(array(sql_errno($serveur), sql_error($serveur), $res), $contexte_compil);
	return false;
}

+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -144,7 +144,7 @@ function spip_sql_erreur($serveur='')
	$connexion = spip_connect($serveur);
	$e = sql_errno($serveur);
	$t = (isset($connexion['type']) ? $connexion['type'] : 'sql');
	$m = "Erreur $e de $t: " . sql_error($serveur) . "\n" . $connexion['last'];
	$m = "Erreur $e de $t: " . sql_error($serveur) . "\nin ".sql_error_backtrace()."\n" . trim($connexion['last']);
	$f = $t . $serveur;
	spip_log($m, $f.'.'._LOG_ERREUR);
}
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -885,6 +885,7 @@ function table_objet($type,$serveur='') {
			return $desc['id_table'];

		spip_log( 'table_objet('.$type.') calculee sans verification');
		spip_log(debug_backtrace(),'db');
	}

	return rtrim($type,'s')."s"; # cas historique ne devant plus servir, sauf si $serveur=false
+6 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -911,7 +911,12 @@ function spip_mysql_countsel($from = array(), $where = array(),
function spip_mysql_error($query='', $serveur='',$requeter=true) {
	$link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
	$s = mysqli_error($link);
	if ($s) spip_log("$s - $query", 'mysql.'._LOG_ERREUR);
	if ($s) {
		$trace = debug_backtrace();
		if ($trace[0]['function']!="spip_mysql_error"){
			spip_log("$s - $query - ".sql_error_backtrace(), 'mysql.'._LOG_ERREUR);
		}
	}
	return $s;
}

+6 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -775,7 +775,12 @@ function spip_sqlite_error($query = '', $serveur = ''){
	} else {
		$s = ": aucune ressource sqlite (link)";
	}
	if ($s) spip_log("$s - $query", 'sqlite.'._LOG_ERREUR);
	if ($s) {
		$trace = debug_backtrace();
		if ($trace[0]['function']!="spip_mysql_error"){
			spip_log("$s - $query - ".sql_error_backtrace(), 'sqlite.'._LOG_ERREUR);
		}
	}
	return $s;
}