Wikini

RegenererWikiniLinks

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-3-90-205-166.compute-1.amazonaws.com

Régénération de la table wikini_links

Cette page a pour but trouver une solution pour permettre à un utilisateur dont la table wikini_links a été perdue ou endommagée de la régénérer [facilement].

Solution purement MySQL

Une approche MySQL du problème me parait préférable, car je pense que s'orienter directement vers un script php risque d'être fort lourd, surtout en quantité de requêtes et peut-être en mémoire utilisée (pour de très gros wikis). Je vais à présent détailler ma démarche:
Tout d'abord on peut constater qu'il sera impossible de faire tout en une seule requête, et même probablement avec juste quelques requêtes, et ce pour les raisons suivantes:
  1. Si une page possède des liens vers des pages n'existant pas, ceux-ci sont tout de même stockés dans la base de données (logique puisque les pages en question seront peut-être créées un jour). MYSQL ne permet vraisemblablement pas d'extraire une chaine correspondant à un masque d'une autre chaine (comme le feraient les fonctions preg_match() et preg_match_all() de php)
  2. Toute page possède un lien vers les pages dont un lien se trouve dans l'entête du site. Normalement il y a moyen d'insérer facilement toutes ces entrées avec une requête dans laquelle on spécifie quelle est la page qui joue le rôle de l'entête (s'il y en a une...). Il y a aussi moyen de le faire en créant une table temporaire (CREATE TEMPORARY TABLE tbl_name ...) qui contiendrait la liste de tous les liens à générer pour toutes les pages.
  3. La cause du point précédent est la suivante: toute page "hérite" des liens de toute page qu'elle inclut (ActionInclude). Reproduire cet héritage avec un INSERT ... SELECT... est impossible puisque d'une part il est interdit d'écrire dans la table depuis laquelle on est en train de lire jusque dans la version 4.0.14 de MySQL, et d'autre part il faudrait d'abord s'assurer que toutes les pages inclues ont déjà leurs liens enrégistrés (or il peut y avoir des inclusions dans les pages inclues...). Il serait cependant possible de passer outre en exécutant une même requête plusieurs fois jusqu'à ce qu'elle ne fasse plus rien. (elle rechercherait les occurences de "{{include page="Tag"}}" via REGEXP)
  4. Le point précédent peut lui aussi être généralisé: toutes les actions qui génèrent des liens ne peuvent être évaluées par MySQL facilement. Seuls les liens qui sont en même temps des paramètres de ces actions seront facilement repèrables. J'imagine qu'il doit être possible de régénérer les liens engendrés par chaque action mais le problème devrait alors être traité plus "individuellement".
En conclusion, ce qu'il est possible de faire en une seule requête:
  1. Lier toutes les pages à leur propriétaire
  2. Lier toutes les pages à leur dernier éditeur
  3. Lier toutes les pages aux pages dont elles possèdent des références directes et qui existent. Pour celles qui n'existent pas je pense qu'il faudra obligatoirement passer par un script php qui risque d'être extrêmement lourd... (établir la liste de toutes les pages, extraire de chaque page tous les NomWiki et regarder s'ils font partie de la liste, écrire une grosse requête d'insertion, en faisant gaffe de pas réinsérer un lien existant...)
  4. Régénérer tous ces liens pour toutes les versions ou uniquement pour la dernière. [Les liens ne concernent (actuellement) que la dernière version. Voir la première ligne de la fonction WriteLinkTable dans wakka.php. -- ProgFou]
Pour ce faire, je propose la requête suivante (à tester encore):
Pour les tests je vous suggère de créer une table wikini_links_test ayant la même structure que wikini_links, et d'effectuer la requête précédente modifiée en conséquence. Dès lors on pourra effectuer des tests de comparaison entre les deux tables:
-- LordFarquaad

Solution PHP

Une solution PHP n'est pas forcément absurde dans le sens où ce besoin de regénération est sensé être très rare. De plus, utiliser une solution MySQL nous fait dépendre des contraintes de ce langage et pourrait nous empêcher de migrer vers un autre type de base de données plus tard. Plus encore, la génération des liens WikiNi nécessite de connaître leur mode de création qui est intimement lié au language WikiNi ; Une solution MySQL nous imposerait donc d'intégrer la grammaire WikiNi autant coté PHP que MySQL. Une solution PHP me semble donc préférable en ce qui me concerne. -- ProgFou

Quelques pistes :

N'oublions pas tout de même que, avec le code de WikiNi, la regénération des liens d'une page est aussi simple que ceci (voir handlers/page/edit.php) :
<?php
  $this
->ClearLinkTable();
  
$this->StartLinkTracking();
  
$dummy $this->Header();
  
$dummy .= $this->Format($body);
  
$dummy .= $this->Footer();
  
$this->StopLinkTracking();
  
$this->WriteLinkTable();
?>

Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]