From 644b34f0064b830c01973d0d08bbb88995d54a30 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 19 Jun 2008 08:08:35 +0000
Subject: [PATCH] optimisations du nombre de requetes sql hors compilation : on
 introduit un sql_fetsel_cache qui cache les resultats, a utiliser sur les
 requetes identiques repetitives dans un meme hit on applique aux requetes de
 parametrer qui coutent en cas d'inclusions nombreuses sql_getfetsel passe par
 sql_fetsel_cache systematiquement (on presume que cette valeur unique est
 suceptible de servir plusieurs fois) fichier_copie_locale economise aussi une
 ou deux requetes par document distant deja rapatrie

---
 ecrire/base/abstract_sql.php | 20 +++++++++++++++++++-
 ecrire/inc/distant.php       | 12 +++++++++++-
 ecrire/public/parametrer.php | 12 ++++++------
 3 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/ecrire/base/abstract_sql.php b/ecrire/base/abstract_sql.php
index c41e800aef..9962c91a5d 100644
--- a/ecrire/base/abstract_sql.php
+++ b/ecrire/base/abstract_sql.php
@@ -350,6 +350,24 @@ function sql_fetsel(
 	return $r2;
 }
 
+# une composition tellement frequente...
+# avec un cache en plus pour les requetes repetitives sur un meme hit
+function sql_fetsel_cache(
+	$select = array(), $from = array(), $where = array(),
+	$groupby = array(), $orderby = array(), $limit = '',
+	$having = array(), $serveur='', $option=true) {
+	static $cache_fetsel=array();
+	$req = sql_select($select, $from, $where,	$groupby, $orderby, $limit, $having, $serveur, false);
+	if ($option==false) return $req;
+	$k = md5($req);
+	if (isset($cache_fetsel[$k])) return $cache_fetsel[$k];
+	$r = sql_query($req, $serveur, $option!==false);
+	if (!$r) return $cache_fetsel[$k]=NULL;
+	$r2 = sql_fetch($r, $serveur, $option!==false);
+	sql_free($r, $serveur, $option!==false);
+	return $cache_fetsel[$k]=$r2;
+}
+
 # Retourne l'unique champ demande dans une requete Select a resultat unique
 // http://doc.spip.org/@sql_getfetsel
 function sql_getfetsel(
@@ -358,7 +376,7 @@ function sql_getfetsel(
 	if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) $id = $c[1];
 	elseif (!preg_match('/\W/', $select)) $id = $select;
 	else {$id = 'n'; $select .= ' AS n';}
-	$r = sql_fetsel($select, $from, $where,	$groupby, $orderby, $limit, $having, $serveur, $option!==false);
+	$r = sql_fetsel_cache($select, $from, $where,	$groupby, $orderby, $limit, $having, $serveur, $option!==false);
 	if (!$r) return NULL;
 	return $r[$id]; 
 }
diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index e95a3e6b07..1e2ab13b08 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -347,6 +347,17 @@ function fichier_copie_locale($source) {
 			$source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source);
 		return $source;
 	}
+	
+	// optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier
+	// a deja ete copie en local avec cette extension
+	// dans ce cas elle est fiable, pas la peine de requeter en base
+	$path_parts = pathinfo($source);
+	$ext = $path_parts ? $path_parts['extension'] : '';
+	if ($ext
+	  AND $f=nom_fichier_copie_locale($source, $ext)
+	  AND file_exists(_DIR_RACINE . $f))
+	  return $f;
+	
 
 	// Si c'est deja dans la table des documents,
 	// ramener le nom de sa copie potentielle
@@ -359,7 +370,6 @@ function fichier_copie_locale($source) {
 	// voir si l'extension indiquee dans le nom du fichier est ok
 	// et si il n'aurait pas deja ete rapatrie
 
-	$path_parts = pathinfo($source);
 	$ext = $path_parts ? $path_parts['extension'] : '';
 
 	if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=".sql_quote($ext))) {
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 8127eb73fe..fb55cc4198 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -135,14 +135,14 @@ function quete_rubrique_fond($contexte) {
 
 	if (isset($contexte['id_rubrique'])
 	AND $id = intval($contexte['id_rubrique'])
-	AND $row = sql_fetsel('lang', 'spip_rubriques',"id_rubrique=$id")) {
+	AND $row = sql_fetsel_cache('id_parent, lang', 'spip_rubriques',"id_rubrique=$id")) {
 		$lang = isset($row['lang']) ? $row['lang'] : '';
 		return array ($id, $lang);
 	}
 
 	if (isset($contexte['id_breve'])
 	AND $id = intval($contexte['id_breve'])
-	AND $row = sql_fetsel('id_rubrique, lang', 'spip_breves', "id_breve=$id")
+	AND $row = sql_fetsel_cache('id_rubrique, lang', 'spip_breves', "id_breve=$id")
 	AND $id_rubrique_fond = $row['id_rubrique']) {
 		$lang = isset($row['lang']) ? $row['lang'] : '';
 		return array($id_rubrique_fond, $lang);
@@ -150,16 +150,16 @@ function quete_rubrique_fond($contexte) {
 
 	if (isset($contexte['id_syndic'])
 	AND $id = intval($contexte['id_syndic'])
-	AND $row = sql_fetsel('id_rubrique', 'spip_syndic', "id_syndic=$id")
+	AND $row = sql_fetsel_cache('id_rubrique', 'spip_syndic', "id_syndic=$id")
 	AND $id_rubrique_fond = $row['id_rubrique']
-	AND $row = sql_fetsel('lang', 'spip_rubriques', "id_rubrique=$id_rubrique_fond")) {
+	AND $row = sql_fetsel_cache('id_parent, lang', 'spip_rubriques', "id_rubrique=$id_rubrique_fond")) {
 		$lang = isset($row['lang']) ? $row['lang'] : '';
 		return array($id_rubrique_fond, $lang);
 	}
 
 	if (isset($contexte['id_article'])
 	AND $id = intval($contexte['id_article'])
-	AND $row = sql_fetsel('id_rubrique, lang', 'spip_articles', "id_article=$id")
+	AND $row = sql_fetsel_cache('id_rubrique, lang', 'spip_articles', "id_article=$id")
 	AND $id_rubrique_fond = $row['id_rubrique']) {
 		$lang = isset($row['lang']) ? $row['lang'] : '';
 		return array($id_rubrique_fond, $lang);
@@ -181,7 +181,7 @@ function quete_parent($id_rubrique) {
 	if (!$id_rubrique = intval($id_rubrique))
 		return 0;
 
-	$id_parent = sql_fetsel('id_parent','spip_rubriques',"id_rubrique=" . $id_rubrique);
+	$id_parent = sql_fetsel_cache('id_parent, lang','spip_rubriques',"id_rubrique=" . $id_rubrique);
 
 	if ($id_parent['id_parent']!=$id_rubrique)
 		return intval($id_parent['id_parent']);
-- 
GitLab