Browse Source

Les fonctions d'abstraction {{{sql_update}}} et {{{sql_updateq}}} se distinguent maintenant par le fait que la première n'effectue aucun traitement sur les opérandes de SET, alors que la seconde introduit des apostrophes pour les types non numériques, et transcode les fonctions et opérandes de dates selon le serveur (MySQL/PG). Cette répartition des rôles permet d'abstraire tous les cas d'utilisation d'UPDATE.

Traitement manuel des cas nécessitant {{{sql_update}}}, qui sont autant d'exemples.
2.0
Committo,Ergo:sum 16 years ago
parent
commit
8b17868986
  1. 28
      ecrire/base/db_pg.php
  2. 4
      ecrire/genie/popularites.php
  3. 4
      ecrire/genie/syndic.php
  4. 12
      ecrire/genie/visites.php
  5. 6
      ecrire/inc/forum.php
  6. 4
      ecrire/inc/import.php
  7. 37
      ecrire/inc/rubriques.php

28
ecrire/base/db_pg.php

@ -434,22 +434,21 @@ function spip_pg_insertq($table, $couples, $desc=array(), $serveur='') {
}
// http://doc.spip.org/@spip_pg_update
function spip_pg_update($table, $champs, $where='', $desc=array()) {
function spip_pg_update($table, $champs, $where='', $desc='', $serveur='') {
if (!$champs) return;
$connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0];
$prefixe = $connexion['prefixe'];
$link = $connexion['link'];
$db = $connexion['db'];
if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table);
if ($where) $where = (" WHERE " . spip_pg_frommysql($where));
$r = '';
foreach ($champs as $champ => $val) {
$r .= ',' . $champ . '=' .
spip_pg_cite($val, $desc['field'][$champ]);
$r .= ',' . $champ . '=' . $val;
}
if ($r = substr($r, 1)) {
if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table);
spip_pg_trace_query("UPDATE $table SET $r" .($where ? (" WHERE " . spip_pg_frommysql($where)) : ''));
}
spip_pg_trace_query("UPDATE $table SET " . substr($r,1) . $where);
}
// idem, mais les valeurs sont des constantes a mettre entre apostrophes
@ -457,20 +456,13 @@ function spip_pg_update($table, $champs, $where='', $desc=array()) {
// http://doc.spip.org/@spip_pg_updateq
function spip_pg_updateq($table, $champs, $where='', $desc=array(), $serveur='') {
if (!$champs) return;
$connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0];
$prefixe = $connexion['prefixe'];
$link = $connexion['link'];
$db = $connexion['db'];
if (!$desc) $desc = description_table($table);
if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table);
$fields = $desc['field'];
$r = '';
foreach ($champs as $champ => $val) {
$r .= ',' . $champ . '=' . spip_pg_cite($val, $fields[$champ]);
foreach ($champs as $k => $val) {
$champs[$k] = spip_pg_cite($val, $fields[$k]);
}
$r = "UPDATE $table SET " . substr($r, 1) . ($where ? " WHERE $where" : '');
return pg_query($link, $r);
return spip_pg_update($table, $champs, $where, $desc, $serveur);
}

4
ecrire/genie/popularites.php

@ -40,8 +40,8 @@ function genie_popularites_dist($t) {
// si la demi-vie n'est pas trop proche de la seconde ;)
$b = log(2) * $periode / $demivie;
// oublier un peu le passe
spip_query("UPDATE spip_articles SET maj=maj, popularite = popularite * $a");
// du passe, faisons table (SQL) rase
sql_update('spip_articles', array('maj'=>'maj', 'popularite' => "popularite * $a"));
// enregistrer les metas...
$row = sql_fetch(spip_query("SELECT MAX(popularite) AS max, SUM(popularite) AS tot FROM spip_articles"));

4
ecrire/genie/syndic.php

@ -87,7 +87,7 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
else
$moderation = 'publie'; // en ligne sans validation
spip_query("UPDATE spip_syndic SET syndication='$statut', date_syndic=NOW() WHERE id_syndic=$now_id_syndic");
sql_updateq('spip_syndic', array('syndication'=>$statut, 'date_syndic'=>'NOW()'), "id_syndic=$now_id_syndic");
// Aller chercher les donnees du RSS et les analyser
include_spip('inc/distant');
@ -111,7 +111,7 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
if (count($faits) > 0) {
$faits = join(",", $faits);
if ($row['miroir'] == 'oui') {
spip_query("UPDATE spip_syndic_articles SET statut='off', maj=maj WHERE id_syndic=$now_id_syndic AND NOT (id_syndic_article IN ($faits))");
sql_update('spip_syndic_articles', array('statut'=>"'off'", 'maj'=>'maj'), "id_syndic=$now_id_syndic AND NOT (id_syndic_article IN ($faits))");
}
// suppression apres 2 mois des liens qui sont sortis du feed
if ($row['oubli'] == 'oui') {

12
ecrire/genie/visites.php

@ -95,7 +95,7 @@ function calculer_visites($t) {
// 1. les visites du site (facile)
spip_query("INSERT IGNORE INTO spip_visites (date) VALUES ('$date')");
spip_query("UPDATE spip_visites SET visites = visites+$visites WHERE date='$date'");
sql_update('spip_visites', array('visites' => "visites+$visites"), "date='$date'");
// 2. les visites des articles (en deux passes pour minimiser
// le nombre de requetes)
@ -123,9 +123,9 @@ function calculer_visites($t) {
$sumref = ' + '.calcul_mysql_in('id_article',
array_keys($referers_a));
spip_query("UPDATE spip_visites_articles SET visites = visites $sum WHERE date='$date' AND $tous");
sql_update('spip_visites_articles', array('visites' => "visites $sum"), "date='$date' AND $tous");
spip_query("UPDATE spip_articles SET visites = visites $sum$sumref, popularite = popularite $sum, maj = maj WHERE $tous");
sql_update('spip_articles', array('visites' => "visites $sum$sumref", 'popularite' => "popularite $sum", 'maj' => 'maj'), $tous);
## Ajouter un JOIN sur le statut de l'article ?
}
@ -145,7 +145,7 @@ function calculer_visites($t) {
// attention on appelle calcul_mysql_in en mode texte et pas array
// pour ne pas passer _q() sur les '0x1234' de referer_md5, cf #849
foreach ($ar as $num => $liste) {
spip_query("UPDATE spip_referers SET visites = visites+$num, visites_jour = visites_jour+$num WHERE ".calcul_mysql_in('referer_md5',join(', ', $liste)));
sql_update('spip_referers', array('visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"), calcul_mysql_in('referer_md5',join(', ', $liste)));
}
}
@ -165,7 +165,7 @@ function calculer_visites($t) {
// ajouter les visites
foreach ($ar as $num => $liste) {
spip_query("UPDATE spip_referers_articles SET visites = visites+$num WHERE ".join(" OR ", $liste));
sql_update('spip_referers_articles', array('visites' => "visites+$num"), join(" OR ", $liste));
## Ajouter un JOIN sur le statut de l'article ?
}
}
@ -190,6 +190,4 @@ function genie_visites_dist($t) {
return 1;
}
?>

6
ecrire/inc/forum.php

@ -217,7 +217,7 @@ function calcul_index_forum($id_article, $id_breve, $id_rubrique, $id_syndic) {
// http://doc.spip.org/@calculer_threads
function calculer_threads() {
// fixer les id_thread des debuts de discussion
spip_query("UPDATE spip_forum SET id_thread=id_forum WHERE id_parent=0");
sql_update('spip_forum', array('id_thread'=>'id_forum'), "id_parent=0");
// reparer les messages qui n'ont pas l'id_secteur de leur parent
do {
$discussion = "0";
@ -233,7 +233,7 @@ function calculer_threads() {
$discussion = $row['id'];
}
}
sql_updateq("spip_forum", array("id_thread" => $precedent ), "id_forum IN ($discussion)");
sql_updateq("spip_forum", array("id_thread" => $precedent), "id_forum IN ($discussion)");
} while ($discussion != "0");
}
@ -318,7 +318,7 @@ function conserver_original($id_forum) {
include_spip('base/abstract_sql');
$id_copie = sql_insertq('spip_forum', $t);
if ($id_copie) {
spip_query("UPDATE spip_forum SET id_parent="._q($id_forum).", statut='original' WHERE id_forum=$id_copie");
sql_updateq('spip_forum', array('id_parent'=> $id_forum, 'statut'=>'original'), "id_forum=$id_copie");
return ''; // pas d'erreur
}
}

4
ecrire/inc/import.php

@ -158,7 +158,7 @@ function import_init_tables($request)
// Bidouille pour garder l'acces admin actuel pendant toute la restauration
sql_delete("spip_auteurs", "id_auteur=0");
spip_query("UPDATE spip_auteurs SET id_auteur=0, extra=$connect_id_auteur WHERE id_auteur=$connect_id_auteur");
sql_updateq('spip_auteurs', array('id_auteur'=>0, 'extra'=>$connect_id_auteur), "id_auteur=$connect_id_auteur");
sql_delete("spip_auteurs", "id_auteur!=0");
return $tables;
@ -175,7 +175,7 @@ function detruit_restaurateur()
if (sql_countsel("spip_auteurs", "id_auteur<>0"))
sql_delete("spip_auteurs", "id_auteur=0");
else {
spip_query("UPDATE spip_auteurs SET id_auteur=extra WHERE id_auteur=0");
sql_update('spip_auteurs', array('id_auteur'=>'extra'), "id_auteur=0");
}
}

37
ecrire/inc/rubriques.php

@ -144,30 +144,22 @@ function calculer_rubriques_publiees() {
$r = sql_select("rub.id_rubrique AS id, max(fille.date) AS date_h", "spip_rubriques AS rub, spip_articles AS fille", "rub.id_rubrique = fille.id_rubrique AND fille.statut='publie' $postdates ", "rub.id_rubrique");
while ($row = sql_fetch($r))
spip_query("UPDATE spip_rubriques
SET statut_tmp='publie', date_tmp='".$row['date_h']."'
WHERE id_rubrique=".$row['id']);
spip_query("UPDATE spip_rubriques SET statut_tmp='publie', date_tmp='".$row['date_h']."'WHERE id_rubrique=".$row['id']);
// Publier et dater les rubriques qui ont une breve publie
$r = sql_select("rub.id_rubrique AS id, max(fille.date_heure) AS date_h", "spip_rubriques AS rub, spip_breves AS fille", "rub.id_rubrique = fille.id_rubrique AND rub.date_tmp <= fille.date_heure AND fille.statut='publie' ", "rub.id_rubrique");
while ($row = sql_fetch($r))
spip_query("UPDATE spip_rubriques
SET statut_tmp='publie', date_tmp='".$row['date_h']."'
WHERE id_rubrique=".$row['id']);
spip_query("UPDATE spip_rubriques SET statut_tmp='publie', date_tmp='".$row['date_h']."' WHERE id_rubrique=".$row['id']);
// Publier et dater les rubriques qui ont un site publie
$r = sql_select("rub.id_rubrique AS id, max(fille.date) AS date_h", "spip_rubriques AS rub, spip_syndic AS fille", "rub.id_rubrique = fille.id_rubrique AND rub.date_tmp <= fille.date AND fille.statut='publie' ", "rub.id_rubrique");
while ($row = sql_fetch($r))
spip_query("UPDATE spip_rubriques
SET statut_tmp='publie', date_tmp='".$row['date_h']."'
WHERE id_rubrique=".$row['id']);
spip_query("UPDATE spip_rubriques SET statut_tmp='publie', date_tmp='".$row['date_h']."' WHERE id_rubrique=".$row['id']);
// Publier et dater les rubriques qui ont un *document* publie
$r = sql_select("rub.id_rubrique AS id, max(fille.date) AS date_h", "spip_rubriques AS rub, spip_documents AS fille, spip_documents_rubriques AS lien", "rub.id_rubrique = lien.id_rubrique AND lien.id_document=fille.id_document AND rub.date_tmp <= fille.date AND fille.mode='document' $postdates ", "rub.id_rubrique");
while ($row = sql_fetch($r))
spip_query("UPDATE spip_rubriques
SET statut_tmp='publie', date_tmp='".$row['date_h']."'
WHERE id_rubrique=".$row['id']);
spip_query("UPDATE spip_rubriques SET statut_tmp='publie', date_tmp='".$row['date_h']."' WHERE id_rubrique=".$row['id']);
// Les rubriques qui ont une rubrique fille plus recente
@ -176,9 +168,7 @@ function calculer_rubriques_publiees() {
$continuer = false;
$r = sql_select("rub.id_rubrique AS id, max(fille.date_tmp) AS date_h", "spip_rubriques AS rub, spip_rubriques AS fille", "rub.id_rubrique = fille.id_parent AND (rub.date_tmp < fille.date_tmp OR rub.statut_tmp<>'publie') AND fille.statut_tmp='publie' ", "rub.id_rubrique");
while ($row = sql_fetch($r)) {
spip_query("UPDATE spip_rubriques
SET statut_tmp='publie', date_tmp='".$row['date_h']."'
WHERE id_rubrique=".$row['id']);
spip_query("UPDATE spip_rubriques SET statut_tmp='publie', date_tmp='".$row['date_h']."' WHERE id_rubrique=".$row['id']);
$continuer = true;
}
} while ($continuer);
@ -189,23 +179,21 @@ function calculer_rubriques_publiees() {
pipeline('calculer_rubriques', null);
// Enregistrement des modifs
spip_query("UPDATE spip_rubriques SET date=date_tmp, statut=statut_tmp");
sql_update('spip_rubriques', array('date'=>'date_tmp', 'statut'=>'statut_tmp'));
}
// http://doc.spip.org/@propager_les_secteurs
function propager_les_secteurs()
{
// fixer les id_secteur des rubriques racines
spip_query("UPDATE spip_rubriques SET id_secteur=id_rubrique
WHERE id_parent=0");
sql_update('spip_rubriques', array('id_secteur'=>'id_rubrique'), "id_parent=0");
// reparer les rubriques qui n'ont pas l'id_secteur de leur parent
do {
$continuer = false;
$r = sql_select("fille.id_rubrique AS id, maman.id_secteur AS secteur", "spip_rubriques AS fille, spip_rubriques AS maman", "fille.id_parent = maman.id_rubrique AND fille.id_secteur <> maman.id_secteur");
while ($row = sql_fetch($r)) {
spip_query("UPDATE spip_rubriques
SET id_secteur=".$row['secteur']." WHERE id_rubrique=".$row['id']);
spip_query("UPDATE spip_rubriques SET id_secteur=".$row['secteur']." WHERE id_rubrique=".$row['id']);
$continuer = true;
}
} while ($continuer);
@ -214,14 +202,12 @@ function propager_les_secteurs()
$r = sql_select("fille.id_article AS id, maman.id_secteur AS secteur", "spip_articles AS fille, spip_rubriques AS maman", "fille.id_rubrique = maman.id_rubrique AND fille.id_secteur <> maman.id_secteur");
while ($row = sql_fetch($r)) {
spip_query("UPDATE spip_articles
SET id_secteur=".$row['secteur']." WHERE id_article=".$row['id']);
spip_query("UPDATE spip_articles SET id_secteur=".$row['secteur']." WHERE id_article=".$row['id']);
}
// reparer les sites
$r = sql_select("fille.id_syndic AS id, maman.id_secteur AS secteur", "spip_syndic AS fille, spip_rubriques AS maman", "fille.id_rubrique = maman.id_rubrique AND fille.id_secteur <> maman.id_secteur");
while ($row = sql_fetch($r))
spip_query("UPDATE spip_syndic SET id_secteur=".$row['secteur']."
WHERE id_syndic=".$row['id']);
spip_query("UPDATE spip_syndic SET id_secteur=".$row['secteur']." WHERE id_syndic=".$row['id']);
}
//
@ -376,8 +362,7 @@ function creer_rubrique_nommee($titre, $id_parent=0) {
$lang = $GLOBALS['meta']['langue_site'];
}
spip_query("UPDATE spip_rubriques SET id_secteur=$id_secteur, lang="._q($lang)."
WHERE id_rubrique=$id_rubrique");
spip_query("UPDATE spip_rubriques SET id_secteur=$id_secteur, lang="._q($lang)." WHERE id_rubrique=$id_rubrique");
} else {
$id_rubrique = $t['id_rubrique'];
}

Loading…
Cancel
Save