From e2d2ba61e332ec112730495e24fbcd0162a56c96 Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Wed, 20 Feb 2008 12:06:55 +0000
Subject: [PATCH] Introcuction de 2 nouvelles fonctions d'abstraction sql : -
 sql_insertq_multi - sql_replace_multi
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Elles sont utiles dans le cas où l'on souhaite utiliser la syntaxe d'insertion multi-ligne de mysql.
- Sous mysql et postgres sql, sql_insertq() créera une requete multiligne : insert into table (cle) values (valeur),(valeur),...
- Sous sqlite, sql_insertq_multi executera chaque ligne avec sql_insertq()

- Sous mysql, sql_replace_multi() creera une requete multiligne
- Sous postgres et sqlite, sql_replace_multi() executera chaque ligne avec sql_replace()

Syntaxe :
Ces fonctions reprennent les paramètres de sql_insertq() et sql_replace() :
sql_insertq($table, $couples)
- $table : nom de la table
- $couples : tableau  ('champ_sql'=>valeur, 'champ_sql'=>valeur...)

sql_insertq_multi($table, $tab_couples)
- $tab_couples : tableau de $couples tout simplement.

A noter que ces fonctions d'insertion multiple retournent le dernier identifiant autoincrement ajouté. Si la table (comme spip_recherches) n'a pas d'autoincrement, la fonction retourne 0 bien que que la requete se soit bien effectuée.

Mis en place sur inc/prepare_recherche.php
La recherche est réparée sous SQLite.
---
 ecrire/base/abstract_sql.php     | 17 ++++++++++++--
 ecrire/inc/prepare_recherche.php | 18 +++++++++-----
 ecrire/req/mysql.php             | 40 +++++++++++++++++++++++++++++---
 ecrire/req/pg.php                | 36 ++++++++++++++++++++++++++++
 ecrire/req/sqlite_generique.php  | 33 ++++++++++++++++++++++----
 5 files changed, 129 insertions(+), 15 deletions(-)

diff --git a/ecrire/base/abstract_sql.php b/ecrire/base/abstract_sql.php
index 0750353772..b029b1e7ee 100644
--- a/ecrire/base/abstract_sql.php
+++ b/ecrire/base/abstract_sql.php
@@ -142,6 +142,12 @@ function sql_insertq($table, $couples=array(), $desc=array(), $serveur='',$reque
 	return $f($table, $couples, $desc, $serveur, $requeter);
 }
 
+function sql_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true)
+{
+	$f = sql_serveur('insertq_multi', $serveur);
+	return $f($table, $tab_couples, $desc, $serveur, $requeter);
+}
+
 // http://doc.spip.org/@sql_update
 function sql_update($table, $exp, $where='', $desc=array(), $serveur='',$requeter=true)
 {
@@ -167,10 +173,17 @@ function sql_delete($table, $where='', $serveur='',$requeter=true)
 }
 
 // http://doc.spip.org/@sql_replace
-function sql_replace($table, $values, $desc=array(), $serveur='',$requeter=true)
+function sql_replace($table, $couples, $desc=array(), $serveur='',$requeter=true)
 {
 	$f = sql_serveur('replace', $serveur);
-	return $f($table, $values, $desc, $serveur, $requeter);
+	return $f($table, $couples, $desc, $serveur, $requeter);
+}
+
+
+function sql_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true)
+{
+	$f = sql_serveur('replace_multi', $serveur);
+	return $f($table, $tab_couples, $desc, $serveur, $requeter);
 }
 
 // http://doc.spip.org/@sql_drop_table
diff --git a/ecrire/inc/prepare_recherche.php b/ecrire/inc/prepare_recherche.php
index ce8d275f1c..ab6f18a383 100644
--- a/ecrire/inc/prepare_recherche.php
+++ b/ecrire/inc/prepare_recherche.php
@@ -76,15 +76,21 @@ function inc_prepare_recherche_dist($recherche, $table='articles', $cond=false,
 
 		// inserer les resultats dans la table de cache des recherches
 		if (count($points)){
-			$values = "";
+			$tab_couples = array();
 			foreach ($points as $id => $p){
-				$values.= ",('$hash',".intval($id).",".intval($p['score']).")";
-				if (strlen($values)>16000) { // eviter les debordements de pile sur tres gros resultats
-					sql_insert('spip_recherches',"(recherche,id,points)",substr($values,1),array(),$serveur);
-					$values = "";
+				$tab_couples[] = array(
+					'recherche' => "$hash",
+					'id' => $id,
+					'points' => $p['score']
+				);
+				//$values.= ",('$hash',".intval($id).",".intval($p['score']).")";
+				if (count($tab_couples)>100) { // eviter les debordements de pile sur tres gros resultats
+					sql_insertq_multi('spip_recherches',$tab_couples,array(),$serveur);
+					$tab_couples = array();
 				}
 			}
-			sql_insert('spip_recherches',"(recherche,id,points)",substr($values,1),array(),$serveur);
+			sql_insertq_multi('spip_recherches',$tab_couples,array(),$serveur);
+			//sql_insert('spip_recherches',"(recherche,id,points)",substr($values,1),array(),$serveur);
 		}
 	}
 
diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php
index 2e7c40d48b..2dac8505db 100644
--- a/ecrire/req/mysql.php
+++ b/ecrire/req/mysql.php
@@ -56,12 +56,14 @@ $GLOBALS['spip_mysql_functions_1'] = array(
 		'in' => 'spip_mysql_in', 
 		'insert' => 'spip_mysql_insert',
 		'insertq' => 'spip_mysql_insertq',
+		'insertq_multi' => 'spip_mysql_insertq_multi',
 		'listdbs' => 'spip_mysql_listdbs',
 		'multi' => 'spip_mysql_multi',
 		'optimize' => 'spip_mysql_optimize',
 		'query' => 'spip_mysql_query',
 		'quote' => 'spip_mysql_quote',
 		'replace' => 'spip_mysql_replace',
+		'replace_multi' => 'spip_mysql_replace_multi',
 		'repair' => 'spip_mysql_repair',
 		'select' => 'spip_mysql_select',
 		'selectdb' => 'spip_mysql_selectdb',
@@ -494,7 +496,27 @@ function spip_mysql_insertq($table, $couples=array(), $desc=array(), $serveur=''
 		$couples[$champ]= spip_mysql_cite($val, $fields[$champ]);
 	}
 
-	return spip_mysql_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur);
+	return spip_mysql_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter);
+}
+
+
+function spip_mysql_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
+
+	if (!$desc) $desc = description_table($table);
+	if (!$desc) die("$table insertion sans description");
+	$fields =  isset($desc['field'])?$desc['field']:array();
+	
+	$cles = "(" . join(',',array_keys($tab_couples[0])) . ')';
+	$valeurs = array();
+	foreach ($tab_couples as $couples) {
+		foreach ($couples as $champ => $val){
+			$couples[$champ]= spip_mysql_cite($val, $fields[$champ]);
+		}
+		$valeurs[] = '(' .join(',', $couples) . ')';
+	}
+	$valeurs = implode(', ',$valeurs);
+
+	return	spip_mysql_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
 }
 
 // http://doc.spip.org/@spip_mysql_update
@@ -539,10 +561,22 @@ function spip_mysql_delete($table, $where='', $serveur='',$requeter=true) {
 }
 
 // http://doc.spip.org/@spip_mysql_replace
-function spip_mysql_replace($table, $values, $keys=array(), $serveur='',$requeter=true) {
-	return spip_mysql_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')', $serveur, $requeter);
+function spip_mysql_replace($table, $couples, $desc=array(), $serveur='',$requeter=true) {
+	return spip_mysql_query("REPLACE $table (" . join(',',array_keys($couples)) . ') VALUES (' .join(',',array_map('_q', $couples)) . ')', $serveur, $requeter);
+}
+
+
+function spip_mysql_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
+	$cles = "(" . join(',',array_keys($tab_couples[0])). ')';
+	$valeurs = array();
+	foreach ($tab_couples as $couples) {
+		$valeurs[] = '(' .join(',',array_map('_q', $couples)) . ')';
+	}
+	$valeurs = implode(', ',$valeurs);
+	return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
 }
 
+
 // http://doc.spip.org/@spip_mysql_multi
 function spip_mysql_multi ($objet, $lang) {
 	$retour = "(TRIM(IF(INSTR(".$objet.", '<multi>') = 0 , ".
diff --git a/ecrire/req/pg.php b/ecrire/req/pg.php
index 4ee653c24c..d3b69bbf4e 100644
--- a/ecrire/req/pg.php
+++ b/ecrire/req/pg.php
@@ -82,11 +82,13 @@ $GLOBALS['spip_pg_functions_1'] = array(
 		'in' => 'spip_pg_in',
 		'insert' => 'spip_pg_insert',
 		'insertq' => 'spip_pg_insertq',
+		'insertq_multi' => 'spip_pg_insertq_multi',
 		'listdbs' => 'spip_pg_listdbs',
 		'multi' => 'spip_pg_multi',
 		'query' => 'spip_pg_query',
 		'quote' => 'spip_pg_quote',
 		'replace' => 'spip_pg_replace',
+		'replace_multi' => 'spip_pg_replace_multi',
 		'select' => 'spip_pg_select',
 		'selectdb' => 'spip_pg_selectdb',
 		'set_connect_charset' => 'spip_pg_set_connect_charset',
@@ -610,6 +612,28 @@ function spip_pg_insertq($table, $couples=array(), $desc=array(), $serveur='',$r
 	return spip_pg_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter);
 }
 
+
+
+function spip_pg_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
+
+	if (!$desc) $desc = description_table($table);
+	if (!$desc) die("$table insertion sans description");
+	$fields =  isset($desc['field'])?$desc['field']:array();
+	
+	$cles = "(" . join(',',array_keys($tab_couples[0])). ')';
+	$valeurs = array();
+	foreach ($tab_couples as $couples) {
+		foreach ($couples as $champ => $val){
+			$couples[$champ]= spip_pg_cite($val, $fields[$champ]);
+		}
+		$valeurs[] = '(' .join(',', $couples) . ')';
+	}
+	$valeurs = implode(', ',$valeurs);
+	
+	return	spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
+}
+
+
 // http://doc.spip.org/@spip_pg_update
 function spip_pg_update($table, $champs, $where='', $desc='', $serveur='',$requeter=true) {
 
@@ -715,6 +739,18 @@ function spip_pg_replace($table, $values, $desc, $serveur='',$requeter=true) {
 	return $couples;
 }
 
+
+function spip_pg_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
+	// boucler pour traiter chaque requete independemment
+	foreach ($tab_couples as $couples){
+		$retour = spip_pg_replace($table, $couples, $desc, $serveur,$requeter);
+	}
+	// renvoie le dernier id 
+	return $retour; 
+}
+
+
+
 // Donne la sequence eventuelle associee a une table 
 // Pas extensible pour le moment,
 
diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php
index ee214b0dde..19e25e88c8 100644
--- a/ecrire/req/sqlite_generique.php
+++ b/ecrire/req/sqlite_generique.php
@@ -509,6 +509,17 @@ function spip_sqlite_insertq($table, $couples=array(), $desc=array(), $serveur='
 }
 
 
+
+function spip_sqlite_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
+	foreach ($tab_couples as $couples) {
+		$retour = spip_sqlite_insertq($table, $couples, $desc, $serveur, $requeter);
+	}
+	// renvoie le dernier id d'autoincrement ajoute
+	return $retour;
+}
+
+
+
 function spip_sqlite_listdbs($serveur='',$requeter=true) {
 	_sqlite_init();
 	
@@ -571,13 +582,25 @@ function spip_sqlite_repair($table, $serveur='',$requeter=true){
 }
 
 
-function spip_sqlite_replace($table, $values, $keys=array(), $serveur='',$requeter=true) {
+function spip_sqlite_replace($table, $couples, $desc=array(), $serveur='',$requeter=true) {
 	
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
-	$values = array_map('spip_sqlite_quote', $values);
-	$values = _sqlite_ajouter_champs_timestamp($table, $values, '', $serveur);
+	$values = array_map('spip_sqlite_quote', $couples);
+	$values = _sqlite_ajouter_champs_timestamp($table, $couples, '', $serveur);
 	
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',$values) . ')', $serveur);
+	return spip_sqlite_query("REPLACE INTO $table (" . join(',',array_keys($couples)) . ') VALUES (' .join(',',$couples) . ')', $serveur);
+}
+
+
+
+function spip_sqlite_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
+	
+	// boucler pour trainter chaque requete independemment
+	foreach ($tab_couples as $couples){
+		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur,$requeter);
+	}
+	// renvoie le dernier id	
+	return $retour; 
 }
 
 
@@ -1068,12 +1091,14 @@ function _sqlite_ref_fonctions(){
 		'in' => 'spip_sqlite_in', 
 		'insert' => 'spip_sqlite_insert',
 		'insertq' => 'spip_sqlite_insertq',
+		'insertq_multi' => 'spip_sqlite_insertq_multi',
 		'listdbs' => 'spip_sqlite_listdbs',
 		'multi' => 'spip_sqlite_multi',
 		'optimize' => 'spip_sqlite_optimize',
 		'query' => 'spip_sqlite_query',
 		'quote' => 'spip_sqlite_quote',
 		'replace' => 'spip_sqlite_replace',
+		'replace_multi' => 'spip_sqlite_replace_multi',
 		'repair' => 'spip_sqlite_repair',
 		'select' => 'spip_sqlite_select',
 		'selectdb' => 'spip_sqlite_selectdb',
-- 
GitLab