admin_vider.php3 forum_envoi.php3 inc_db_mysql.php3 inc_forum.php3 inc_invalideur.php3 inc_majbase.php3 inc_serialbase.php3 inc_version.php3 1.15 1.31 1.23 1.3 1.9 1.8 1.3 1.346 1.16 1.32 1.24 1.4 1.10 1.9 1.4 1.347

Update of /home/spip-cvs/spip/ecrire
In directory alan:/tmp/cvs-serv15892/ecrire

Modified Files:
  admin_vider.php3 forum_envoi.php3 inc_db_mysql.php3
  inc_forum.php3 inc_invalideur.php3 inc_majbase.php3
  inc_serialbase.php3 inc_version.php3
Log Message:
encore beaucoup de modifs, je ne détaille pas, car elles sont surtout du fond et des suites de discussions sur spip-dev :

* le debogueur devient de plus en plus riche et subtil (n'affiche plus à tout vent les erreurs mysql, par exemple, mais seulement aux admins)

* nettoayge du code des forums

* tentative de résoudre le bug de ecrire_fichier sous windows

* En matière de boucles et balises, l'ajout de id_thread dans la table spip_forum donne tout de suite le critère {id_thread} qui va bien pour retrouver le pied d'une discussion

etc.

Il va falloir mettre à jour NOUVEAUTES et TODO :slight_smile:

Index: admin_vider.php3

RCS file: /home/spip-cvs/spip/ecrire/admin_vider.php3,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- admin_vider.php3 26 Aug 2004 03:47:01 -0000 1.15
+++ admin_vider.php3 27 Aug 2004 04:27:03 -0000 1.16
@@ -78,11 +78,13 @@

echo "<TR><TD class='serif'>";

-$row = spip_fetch_array(spip_query("SELECT SUM(taille) FROM spip_caches"));
-if ($row[0]>0)
+list ($taille) = spip_fetch_array(spip_query(
+"SELECT SUM(taille) FROM spip_caches WHERE type='t'"));
+
+if ($taille>0) {
   $info = _L("La taille du cache est actuellement de "
- .taille_en_octets($row[0]).".");
-else
+ .taille_en_octets($taille).".");
+} else
   $info = _L('Le cache est vide.');

echo "<p align='justify'><b>$info</b></p>\n";

Index: inc_serialbase.php3

RCS file: /home/spip-cvs/spip/ecrire/inc_serialbase.php3,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- inc_serialbase.php3 17 Aug 2004 06:43:43 -0000 1.3
+++ inc_serialbase.php3 27 Aug 2004 04:27:03 -0000 1.4
@@ -256,6 +256,7 @@
$spip_forum = array(
     "id_forum" => "bigint(21) NOT NULL",
     "id_parent" => "bigint(21) DEFAULT '0' NOT NULL",
+ "id_thread" => "bigint(21) DEFAULT '0' NOT NULL",
     "id_rubrique" => "bigint(21) DEFAULT '0' NOT NULL",
     "id_article" => "bigint(21) DEFAULT '0' NOT NULL",
     "id_breve" => "bigint(21) DEFAULT '0' NOT NULL",

Index: forum_envoi.php3

RCS file: /home/spip-cvs/spip/ecrire/forum_envoi.php3,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- forum_envoi.php3 24 Jul 2004 00:45:06 -0000 1.31
+++ forum_envoi.php3 27 Aug 2004 04:27:03 -0000 1.32
@@ -2,6 +2,7 @@

include ("inc.php3");
include_ecrire ("inc_barre.php3");
+include_ecrire ("inc_forum.php3");

if ($modif_forum != "oui") $titre_message = ereg_replace("^([^>])", "> \\1", $titre_message);
@@ -15,6 +16,8 @@
   "VALUES (\"$titre_message\", \"$texte\", NOW(), \"$nom_site\", \"$url_site\", \"$statut\", \"$connect_id_auteur\", \"$nom\", '$connect_email', '$id_rubrique', '$id_parent', '$id_article', '$id_breve', '$id_message', '$id_syndic')";
   $result = spip_query($query);

+ calculer_threads();
+
   if ($id_message > 0) {
     $query = "UPDATE spip_auteurs_messages SET vu = 'non' WHERE id_message='$id_message'";
     $result = spip_query($query);

Index: inc_forum.php3

RCS file: /home/spip-cvs/spip/ecrire/inc_forum.php3,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- inc_forum.php3 24 Aug 2004 14:43:42 -0000 1.3
+++ inc_forum.php3 27 Aug 2004 04:27:03 -0000 1.4
@@ -66,5 +66,38 @@
   if ($id_syndic) return 's'.$id_syndic;
}

-
+//
+// Recalculer tous les 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");
+
+ // reparer les messages qui n'ont pas l'id_secteur de leur parent
+ do {
+ $discussion = "0";
+ $precedent = 0;
+ $r = spip_query("SELECT fille.id_forum AS id,
+ maman.id_thread AS thread
+ FROM spip_forum AS fille, spip_forum AS maman
+ WHERE fille.id_parent = maman.id_forum
+ AND fille.id_thread <> maman.id_thread
+ ORDER BY thread");
+ while (list($id, $thread) = spip_fetch_array($r)) {
+ if ($thread == $precedent)
+ $discussion .= ",$id";
+ else {
+ if ($precedent)
+ spip_query("UPDATE spip_forum SET id_thread=$precedent
+ WHERE id_forum IN ($discussion)");
+ $precedent = $thread;
+ $discussion = "$id";
+ }
+ }
+ spip_query("UPDATE spip_forum SET id_thread=$precedent
+ WHERE id_forum IN ($discussion)");
+ } while ($discussion != "0");
+}
+
?>

Index: inc_version.php3

RCS file: /home/spip-cvs/spip/ecrire/inc_version.php3,v
retrieving revision 1.346
retrieving revision 1.347
diff -u -d -r1.346 -r1.347
--- inc_version.php3 26 Aug 2004 03:47:01 -0000 1.346
+++ inc_version.php3 27 Aug 2004 04:27:03 -0000 1.347
@@ -202,10 +202,10 @@
// (utilise pour les modifs de la base de donnees)

// version de la base
-$spip_version = 1.804;
+$spip_version = 1.805;

// version de spip
-$spip_version_affichee = "1.8 alpha 5 CVS";
+$spip_version_affichee = "1.8 alpha 6 CVS";

// version de spip / tag cvs
if (ereg('Name: v(.*) ','$Name$', $regs)) $spip_version_affichee = $regs[1];
@@ -821,7 +821,8 @@
function test_flock ($dir, $fp=false) {
   static $flock = array();
   global $flag_flock;
- if (!$flag_flock)
+ if (!$flag_flock
+ OR $os_serveur == 'windows') // sous win rename() plante avec fopen()
     return false;

   if (!$dir) $dir = '.';
@@ -853,20 +854,28 @@

   if (!test_flock($dir))
     return true;
- else
- return @flock($filehandle, $mode);
+
+ $r = flock($filehandle, $mode);
+
+ // demande de verrou ==> risque de sleep ==> forcer la relecture de l'etat
+ if ($mode == LOCK_EX)
+ clearstatcache();
+
+ return $r;
}

function spip_file_get_contents ($fichier) {
   if (substr($fichier, -3) != '.gz') {
- if (function_exists('file_get_contents'))
- return @file_get_contents($fichier);
+ if (function_exists('file_get_contents')
+ AND $os_serveur !='windows') # windows retourne ''
+ return @file_get_contents ($fichier);
     else
       return join('', file($fichier));
   } else
       return join('', gzfile($fichier));
   
}
+
// options = array(
// 'phpcheck' => 'oui' # verifier qu'on a bien du php
// dezippe automatiquement les fichiers .gz
@@ -909,13 +918,17 @@
// zippe les fichiers .gz
function ecrire_fichier ($fichier, $contenu) {

+ // Ne rien faire si on est en preview ou si une erreur
+ // grave s'est presentee (compilation du squelette, MySQL, etc)
+ if ($GLOBALS['var_preview'] OR defined('spip_erreur_fatale'))
+ return;
+
   // Ecriture dans un fichier temporaire
   // dans le repertoire destination
   preg_match('|(.*)/([^/]*)$|', $fichier, $match);
   $dir = $match[1];
   $fichiertmp = $dir.'/'
- .uniqid(substr(md5($fichier),0,6).'-'
- .@getmypid()).".tmp";
+ .uniqid(substr(md5($fichier),0,6).'-'.@getmypid()).".tmp";

   $gzip = (substr($fichier, -3) == '.gz');

@@ -934,36 +947,52 @@
   if ($ft = @$fopen($fichiertmp, 'wb')) {
     // on en profite pour tester flock()
     $flock = test_flock($dir, $ft);
- $s = @$fputs($ft, $contenu);
+ $s = @$fputs($ft, $contenu, $a = strlen($contenu));
     @$fclose($ft);
- $ok = (strlen($contenu) == $s);
+ $ok = ($s == $a);
   }

   if ($ok) {
     // ouvrir et obtenir un verrou sur le fichier destination
- if ($fp = @fopen($fichier, 'a')) {
- if ($flock) while (!spip_flock($fp, LOCK_EX, $fichier));
-
- // recopier le temporaire
- $ok = @rename($fichiertmp, $fichier);
+ if ($flock AND $fp = @fopen($fichier, 'a'))
+ while (!spip_flock($fp, LOCK_EX, $fichier));

- // liberer le verrou
- if ($flock) spip_flock($fp, LOCK_UN, $fichier);
+ // recopier le temporaire
+ $ok = @rename("./".$fichiertmp, "./".$fichier);

+ // liberer le verrou
+ if ($flock AND $fp) {
+ spip_flock($fp, LOCK_UN, $fichier);
       @fclose($fp);
     }
   }

   // en cas d'echec effacer le temporaire
- if (!$ok)
+ if (!$ok) {
+ spip_log("echec ecriture fichier $fichier");
     @unlink($fichiertmp);
+ }

   #spip_log("$fputs $fichier ".spip_timer('ecrire_fichier'));

   return $ok;
}

+//
+// Supprimer un fichier en attendant d'abord de le spip_flock
+//
+function supprimer_fichier ($fichier) {
+ if (!@file_exists($fichier))
+ return false;
+
+ if ($fl = @fopen($fichier, 'r')) {
+ while(!spip_flock($fl, LOCK_EX));
+ spip_flock($fl, LOCK_UN);
+ @fclose($fl);
+ @unlink($fichier);
+ }
+}

//
// Lire les meta cachees

Index: inc_invalideur.php3

RCS file: /home/spip-cvs/spip/ecrire/inc_invalideur.php3,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- inc_invalideur.php3 26 Aug 2004 14:16:13 -0000 1.9
+++ inc_invalideur.php3 27 Aug 2004 04:27:03 -0000 1.10
@@ -62,26 +62,27 @@
   if (preg_match(
   "|^CACHE(/[0-9a-f])?(/[0-9]+)?/[^.][\-_\%0-9a-z]+\.[0-9a-f]+(\.gz)?$|i",
   $cache)) {
- @unlink($cache); // supprimer le fichier
- @unlink($cache.'.NEW'); // et le fichier compagnon s'il existe
+ // supprimer le fichier (avec spip_flock)
+ supprimer_fichier($cache);
+ // et le fichier compagnon s'il existe
+ @unlink($cache.'.NEW');
   } else
     spip_log("Impossible de retirer $cache");
}

// Supprimer les caches marques "x"
-function retire_caches($forcer = false) {
+function retire_caches($chemin_prioritaire = '') {
   if ($GLOBALS['flag_ecrire']) return;

- // marque comme fait
- effacer_meta('invalider');
- ecrire_metas();
-
- // essayer d'eviter de faire le meme travail qu'un autre processus
- // attendre maxi 3 secondes
- spip_get_lock("invalidation", 4);
+ // inutile de ramer si tout est invalide, on n'est pas tout seul
+ $max = 30;
+ // mais recuperer en priorite notre chemin
+ if ($chemin_prioritaire)
+ $order = "ORDER BY fichier != '$chemin_prioritaire'";

   // faire le boulot de suppression
- $q = spip_query("SELECT DISTINCT fichier FROM spip_caches WHERE type='x'");
+ $q = spip_query("SELECT DISTINCT fichier FROM spip_caches
+ WHERE type='x' $order LIMIT 0,$max");
   if ($n = @spip_num_rows($q)) {
     spip_log ("Retire $n caches");
     while (list($cache) = spip_fetch_array($q)) {
@@ -91,6 +92,12 @@
     spip_query("DELETE FROM spip_caches WHERE "
     .calcul_mysql_in('fichier', join(',',$supprimes)) );
   }
+
+ // marque comme fait
+ if (count($supprimes) < $max) {
+ effacer_meta('invalider');
+ ecrire_metas();
+ }
}

//

Index: inc_majbase.php3

RCS file: /home/spip-cvs/spip/ecrire/inc_majbase.php3,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- inc_majbase.php3 22 Aug 2004 16:38:32 -0000 1.8
+++ inc_majbase.php3 27 Aug 2004 04:27:03 -0000 1.9
@@ -878,6 +878,14 @@
     maj_version(1.804);
   }

+ if ($version_installee < 1.805) {
+ spip_query("ALTER TABLE spip_forum
+ ADD id_thread bigint(21) DEFAULT '0' NOT NULL");
+ include_ecrire('inc_forum.php3');
+ calculer_threads();
+ maj_version(1.805);
+ }
+
   return true;
}

Index: inc_db_mysql.php3

RCS file: /home/spip-cvs/spip/ecrire/inc_db_mysql.php3,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- inc_db_mysql.php3 25 Aug 2004 21:55:17 -0000 1.23
+++ inc_db_mysql.php3 27 Aug 2004 04:27:03 -0000 1.24
@@ -175,6 +175,5 @@
       calcul_mysql_in($val, $valeurs, $not));
     }
}
-

?>