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 
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));
}
}
-
?>