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