Valider df3493de rédigé par marcimat's avatar marcimat
Parcourir les fichiers

Figurez-vous que SQLite ne râlait pas toujours en présence d'une erreur de...

Figurez-vous que SQLite ne râlait pas toujours en présence d'une erreur de requête SQL sur une boucle.

Avec MySQL la même erreur était bien présente avec un appel à erreur_squelette. Il se trouve que le retour de la fonction spip_sqlite_select() du gestionnaire SQL doit retourner le texte de la requête en cas d'erreur afin que sql_select() puisse afficher l'erreur de squelette. Ce n'était pas fait avec SQLite.

En plus de cela, on simplifie d'affichage des erreurs et numéros d'erreur SQLite : Le numéro d'erreur en SQLite 3 est «HY000 / 1» par exemple ; le texte d'erreur n'a plus que le message (sans numéros inutiles en plus).

Enfin, on affine ou crée quelques PHPdoc et on évite une notice de plus.
parent 8d5e1f68
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+12 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -188,6 +188,7 @@ function sql_select ($select = array(), $from = array(), $where = array(),
		$res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true);
	}

	// en cas d'erreur
	if (!is_string($res)) return $res;
	// denoncer l'erreur SQL dans sa version brute
	spip_sql_erreur($serveur);
@@ -666,7 +667,7 @@ function sql_multi($sel, $lang, $serveur='', $option=true)


/**
 * Retourne la derniere erreur connue
 * Retourne la dernière erreur connue
 *
 * @api
 * @param string $serveur
@@ -681,7 +682,16 @@ function sql_error($serveur='') {
	return $f('query inconnue', $serveur);
}

// http://doc.spip.org/@sql_errno
/**
 * Retourne le numéro de la derniere erreur connue
 *
 * @api
 * @param string $serveur
 *      Nom du connecteur
 * @return bool|int
 *      Numéro de l'erreur
 *      False si le serveur est indisponible
 */
function sql_errno($serveur='') {
	$f = sql_serveur('errno', $serveur, 'continue');
	if (!is_string($f) OR !$f) return false;
+35 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -2001,6 +2001,22 @@ function exec_info_dist() {
		echo "pas admin";
}

/**
 * Génère une erreur de squelette
 *
 * Génère une erreur de squelette qui sera bien visible par un
 * administrateur authentifié lors d'une visite de la page en erreur 
 *
 * @param bool|string|array $message
 * 		- Message d'erreur (string|array)
 * 		- false pour retourner le texte des messages d'erreurs
 * 		- vide pour afficher les messages d'erreurs
 * @param string|array|object $lieu
 * 		Lieu d'origine de l'erreur
 * @return null|string
 * 		Rien dans la plupart des cas
 * 		- string si $message à false.
**/
function erreur_squelette($message='', $lieu='') {
	$debusquer = charger_fonction('debusquer', 'public');
	if (is_array($lieu)) {
@@ -2011,20 +2027,36 @@ function erreur_squelette($message='', $lieu='') {
}

/**
 * Calcule un squelette avec un contexte et retourne son contenu
 * 
 * La fonction de base de SPIP : un squelette + un contexte => une page.
 * $fond peut etre un nom de squelette, ou une liste de squelette au format array.
 * Dans ce dernier cas, les squelettes sont tous evalues et mis bout a bout
 * $options permet de selectionner les options suivantes :
 * 	trim => true (valeur par defaut) permet de ne rien renvoyer si le fond ne produit que des espaces ;
 * 	raw => true permet de recuperer la strucure $page complete avec entetes et invalideurs pour chaque $fond fourni.
 * 	raw  => true permet de recuperer la strucure $page complete avec entetes et invalideurs
 *          pour chaque $fond fourni.
 *
 * @api
 * @param string/array $fond
 * 		Le ou les squelettes à utiliser, sans l'extension, {@example prive/liste/auteurs}
 * 		Le fichier sera retrouvé dans la liste des chemins connus de SPIP (squelettes, plugins, spip)
 * @param array $contexte
 * 		Informations de contexte envoyées au squelette, {@example array('id_rubrique' => 8)}
 * 		La langue est transmise automatiquement (sauf option étoile).
 * @param array $options
 * 		Options complémentaires :
 * 		- trim   : applique un trim sur le résultat (true par défaut)
 * 		- raw    : retourne un tableau d'information sur le squelette (false par défaut)
 * 		- etoile : ne pas transmettre la langue au contexte automatiquement (false par défaut),
 * 		           équivalent de INCLURE*
 * 		- ajax   : gere les liens internes du squelette en ajax (équivalent du paramètre {ajax})
 * @param string $connect
 * @return string/array
 * 		Non du connecteur de bdd a utiliser
 * @return string|array
 * 		Contenu du squelette calculé
 * 		ou tableau d'information sur le squelette.
 */
// http://doc.spip.org/@recuperer_fond
function recuperer_fond($fond, $contexte=array(), $options = array(), $connect='') {
	if (!function_exists('evaluer_fond'))
		include_spip('public/assembler');
+2 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -291,7 +291,6 @@ function calculer_boucle($id_boucle, &$boucles) {

	$boucle = &$boucles[$id_boucle];
	instituer_boucle($boucle);

	$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);

	// en mode debug memoriser les premiers passages dans la boucle,
@@ -913,8 +912,8 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
	$f = charger_fonction('phraser_' . $gram, 'public');

	$squelette = $f($squelette, '', $boucles, $descr);

	$boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);

	// restituer les echappements
	if ($esc)
		foreach($boucles as $i=>$boucle) {
+33 −13
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -116,18 +116,22 @@ function public_debusquer_dist($message = '', $lieu = ''){

function debusquer_compose_message($msg){
	if (is_array($msg)){
		// sqlite renvoit des erreurs alpha num
		if (!is_numeric($msg[0]) AND count($msg)==2)
		// si c'est un texte, c'est une traduction a faire, mais
		// sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
		if (!is_numeric($msg[0]) AND count($msg)==2) {
			// message avec argument: instancier
			$msg = _T($msg[0], $msg[1], 'spip-debug-arg');
		else
		} else {
			// message SQL: interpreter
			$msg = debusquer_requete($msg);
		}
	}
	// [fixme] le fond n'est pas la si on n'est pas dans un squelette
	// cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
	$fond = isset($GLOBALS['fond']) ? $GLOBALS['fond']  : "";
	spip_log("Debug: " . $msg . " (" . $fond . ")");
	// une erreur critique sort $message en array
	$debug = is_array($msg) ? $msg[1] : $msg;
	spip_log("Debug: " . $debug . " (" . $fond . ")");
	return $msg;
}

@@ -227,24 +231,38 @@ function debusquer_navigation($tableau, $caption = '', $id = 'debug-nav'){
		. "</table>";
}

//
// Si une boucle cree des soucis, on peut afficher la requete fautive
// avec son code d'erreur
//

/**
 * Retourne le texte d'un message d'erreur de requête 
 *
 * Si une boucle cree des soucis, on peut afficher la requete fautive
 * avec son code d'erreur
 *
 * @param array $message
 * 		Description du message en 3 éléments :
 * 		- numéro d'erreur
 * 		- texte de l'erreur
 * 		- requête en erreur
 * @return string|array
 * 		Retourne le texte de l'erreur a afficher
 * 		ou un tableau si l'erreur est critique
**/
function debusquer_requete($message){
	list($errno, $msg, $query) = $message;

	// [fixme] ces écritures mélangent divers syntaxe des moteurs SQL
	// il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
	if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $msg, $regs)){
		$errno = $regs[2];

	}
	elseif (($errno==1030 OR $errno<=1026)
	elseif (is_numeric($errno) and ($errno==1030 OR $errno<=1026)
		AND preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $msg, $regs)
	)
	) {
		$errno = $regs[1];
	}

	// Erreur systeme
	if ($errno>0 AND $errno<200){
	if (is_numeric($errno) and $errno>0 AND $errno<200){
		$retour = "<tt><br /><br /><blink>"
			. _T('info_erreur_systeme', array('errsys' => $errno))
			. "</blink><br />\n<b>"
@@ -254,8 +272,8 @@ function debusquer_requete($message){
		spip_log("Erreur systeme $errno");
		return array($retour, '');
	}
	// Requete erronee

	// Requete erronee
	$err = "<b>" . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
		. htmlspecialchars($msg)
		. "\n<br /><span style='color: red'><b>"
@@ -266,6 +284,8 @@ function debusquer_requete($message){
	return $err;
}



// http://doc.spip.org/@trouve_boucle_debug
function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = ""){
	global $debug_objets;
+2 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -159,7 +159,8 @@ function spip_query_db($query, $serveur='',$requeter=true) {
 * @param bool $requeter
 * @return array|null|resource|string
 *
 */function spip_mysql_query($query, $serveur='',$requeter=true) {
 */
function spip_mysql_query($query, $serveur='',$requeter=true) {

	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
	$prefixe = $connexion['prefixe'];
Chargement en cours