- encoding (utf8)
- eof_ending (saut le ligne en fin de fichier)
- elseif (pas else if)
- function_call_space (espaces sur fonctions)
- function_declaration (pareil)
- function_typehint_space (pareil)
Mais le bug #2326 qu'elle a entrainee a permis de remettre a plat la sequence d'init des globales et pipelines dans le cas delicat du hit ou les plugins ne sont pas encore compiles
On commence donc par initilaliser les globales/static et ensuite seulement on appelle les pipelines
ce qui permet d'avoir deja les infos courantes en cas de retour
- eviter de creer une ré-entrance inutilie dans lister_tables_objets_sql.
Pour ce faire on déplace les deux fonctions declarer_tables_principales et declarer_tables_auxiliaires dans base/objets,
et les deux fichiers inc/serial et inc/auxiliaires ne sont plus là que pour compatibilité (puisqu'on devrait maintenant toujours utiliser lister_tables_principales() et lister_tables_auxiliaires() )
- Cela fait, on peut loger une éventuelle ré-entrance dans lister_tables_objets_sql qui signale une anomalie grave
La declaration de taches periodiques reste identique a auparavant (pipeline taches_generales_cron)
La balise #SPIP_CRON disparait, remplacee par un declenchement en fin de hit uniquement quand une tache
est en attente. Pour le declenchement, on utilise preferentiellement un socket, et a defaut une image background comme avant.
Lors d'un appel, le sequenceur execute autant de taches en attente que possible, dans la limite d'un temps donné. Des appels concurents peuvent se jouer, mais chaque tache est executee une unique fois par une seule instance. L'unicité de l'execution est garantie par un sql_delete.
SI jamais le nombre de taches en attente depasse un seuil (10000 par defaut) la file est purgee par un appel en fin de hit, synchrone.
Une page d'aministration est accesible aux administrateurs depuis le menu maintenance.
L'API est
/**
* Ajout d'une tache dans la file d'attente
*
* @param $function
* The function name to call.
* @param $description
* A human-readable description of the queued job.
* @param $arguments
* Optional array of arguments to pass to the function.
* @param $file
* Optional file path which needs to be included for $fucntion.
* @param $no_duplicate
* If TRUE, do not add the job to the queue if one with the same function and
* arguments already exists.
* @param $time
* time for starting the job. If 0, job will start as soon as possible
* @param $priority
* -10 (low priority) to +10 (high priority), 0 is the default
* @return int
* id of job
*/
function job_queue_add($function, $description, $arguments = array(), $file = '', $no_duplicate = FALSE, $time=0, $priority=0)
/**
* Supprimer une tache de la file d'attente
* @param int $id_job
* id of jonb to delete
* @return bool
*/
function job_queue_remove($id_job)
/**
* Associer une tache a un/des objets de SPIP
* @param int $id_job
* id of job to link
* @param array $objets
* can be a simple array('objet'=>'article','id_objet'=>23)
* or an array of simple array to link multiples objet in one time
*/
function job_queue_link($id_job,$objets)
Dans ce cas, on stocke dans la table resultats du serveur principal les résultats de recherche, et on produit une requete qui contient
explicitement les id et les points des résultats (comme le faisait SPIP<2)
Pour ce faire on étend la table des résultats avec une colonne serveur qui stocke un hash du serveur (pour limiter la longueur du champ) quand ce n'est pas le serveur principal.
Au passage, on ajoute également une colonne table_objet pour faire expliciter la table_objet des résultats, le hash ne contenant plus que le terme de la recherche proprement dite, ce qui réouvre la voie vers une boucle de recherche composite multi-objets
cela unifie la declaration des tables auxiliaires avec celle des tables principales.
Par ailleurs l'installation utilise les fonctions lister_tables_principales et lister_tables_auxiliaires plutot qu'un appel aux globales. Cela revient au meme pour le moment, mais en systematisant l'appel a ces fonctions, cela rendra possible la suppression de la globale au profit de variables internes non accessibles.
Utilisation pour optimiser les liens documents (a la place du code buggue existant) et auteurs (n'etait pas pris en charge)
nettoyage des tables auxiliaires qui n'existent plus
Je profite de cette écriture massive pour normaliser quelque chose de trompeur lorsqu'on compare deux versions, savoir l'usage de " ou ' dans le premier argument de define et defined. Comme les chaînes entre apostrophes sont plus rapidement analysées que celles entre guillemets, je choisis l'apostrophe.
Dépot obtenu avec le script Shell:
{{{
a=$(find . -name "*.php" |grep -v extensions/ | grep -v /config/ | grep -v index.php | grep -v public.php | grep -v prive.php )
echo -n "Fichiers: "
echo $a|wc -w
for i in $a
do
sed -f ~/Sites/spip/spip.sed $i > /tmp/f.php
if diff -q $i /tmp/f.php
then
:
else
diff $i /tmp/f.php
# echo $i; php /tmp/f.php
# mv /tmp/f.php $i
fi
done
}}}
et le script Sed:
{{{
s/Copyright (c) 2001-20../Copyright (c) 2001-2011/
s,\(if [(]!*\)*\(defined* *[(]\)"\([^"]*\)"\(.*\);[[:space:]]*[#/]*.*$,\1\2'\3'\4;,
}}}
et permettra aussi de gerer les liens auteur sur n'importe quel objet. On a en plus un champ vu sur la table de liaison, qui est utilise dans la messagerie.
On pourra avoir plus tard un champ role permettant de distinguer les roles des auteurs.
Ce premier commit met a jour toutes les requetes SQL, et prend en charge l'upgrade de la base.
Mais il n'est pas encore totalement fonctionnel.
debug a suivre.
Introduction de 2 pipelines pour cela :
-* affichage_entetes_final() reçevant le tableau php d'entêtes de la page et permettant d'agir dessus.
-* configurer_liste_metas() reçevant le tableau des valeurs par défaut des metas de SPIP et permettant d'agir dessus (et servant à la sauvegarde des fichiers de configurations actuels de SPIP)
Reste à corriger :
-* le formulaire d'administration,
-* les images,
-* les chaines de langues,
-* les bugs non vus...
ce qui la rend extensible et utilisable par les plugins pour tout type d'objet
l'upgrade devrait se faire a partir de la table spip_documents_liens precedente ou des anciennes tables spip_documents_xxx selon le point de depart
declarer_tables_principales
declarer_tables_auxiliaires
pour des raisons de performance (permet de ne charger les fichiers base/serial et base/aux que quand necessaire, et pas a chaque hit
ou a chaque calcul comme il etait generalement fait auparavant)
L'ecriture directe dans la globale par les plugins avec inclusion prealable de base/serial ou base/aux reste acceptee, mais sera obsolete a moyen terme.
Les plugins qui respectent la nouvelle methode amelioreront leur performance.
- creation d'une table spip_recherches qui stockent les resultats par id/points pour chaque recherche
- les requetes decriees par #1231 et consort disparaissent au profit d'une simple jointure
La portabilite sql est a verifier pour cause :
- d'une fonction HEX() reliquat des vieilles version mysql
- dune jointure implicite ecrite en clause SELECT/WHERE dans le critere recherche
Comme auparavant, une URL propre d'un objet publié est créée le plus souvent lorsque qu'une page qui la référence est visualisée dans l'espace public. Comme auparavant, il est nécessaire qu'un administrateur clique sur "voir en ligne" ou "prévisualiser" pour provoquer un nouveau calcul. En revanche, ce nouveau calcul interviendra systématiquement (plus besoin de dépublier puis republier), et s'il fournit une URL différente, elle n'écrasera pas l'ancienne, mais viendra s'ajouter comme URL la plus récemment introduite. Lors des appels ultérieurs de la fonction de génération d'URL associée, elle sera donc choisi prioritairement. Au cas où une nouvelle modification produit un calcul d'URL retombant sur une ancienne URL propre, la date d'introduction de celle-ci est actualisée afin qu'elle redevienne prioritaire, ce qui permet de respecter la contrainte d'unicité et d'éviter aux indécis de remplir cette table par leurs begaiements.
Ces nouvelles URL profitent du travail pionnier entamé par Toggg sur spip_zonesous le nom d'[http://zone.spip.org/trac/spip-zone/browser/_plugins_/_dev_/urls_libres URLS libres]. L'implémentation en est toutefois différente, afin de satisafaire aux besoins de PostGres. Aussi, elles sont gérées par une table ayant ces valeurs comme clé primaire, ce qui devrait accélérer leur recherche, et permet d'évacuer le dernier verrou spécifique à MySQL.
Remarque: au moment de la mise à jour avec cette nouvelle implémentation, les URLs propre courament dans la base seront recopiées dans la nouvelle table, sans aucune perte.
''Il y a des problèmes avec les index de la table `spip_versions` La colonne `id_article` ne devrait pas faire partie à la fois d'une clé primaire et d'une clé index''
(Philippe Auriol)