Skip to content
Extraits de code Groupes Projets
Valider b6ce347c rédigé par esj's avatar esj
Parcourir les fichiers

Interface unique pour le multi-base.

SPIP peut à présent se connecter à plusieurs serveurs SQL (MySQL ou PG) en utilisant systématiquement la fonction '''spip_connect_db''' appelée dans le fichier créé à l'installation, qu'il s'agisse de la base principale (contenant notamment la table des auteurs) ou d'autres bases, gérées par SPIP ou non. Un des intérêts de cette nouvelle interface est qu'il suffit de copier le fichier '''connect.php''' d'un site A dans le répertoire '''config''' d'un site B, en lui donnant le nom '''connect'''A'''.php''' pour que le site B ait accès aux tables du site A, en utilisant dans les squelettes de B la forme
{{{<BOUCLE(A:T)...}}}.

Cette possibilité appelle quelques remarques.

* dans le cas de sites dont on gére soi-même la mutusalisation des sources, il est alors opportun de prendre un seul répertoire '''config''' commun à tous les sites A B ... et de changer le nom du fichier de connexion (indiqué par la constante '''_FILE_CONNECT'''') en '''connnect'''A'''.php''', '''connnect'''B'''.php''' ... pour que l'installation d'un site suffise à en faire une base secondaire des autres, sans plus avoir besoin de copier ces fichiers.

* dans le cas de sites distants, le multi-base est possibile si le serveur SQL du site secondaire accepte les connexions du serveur Http du site principal, ce qu'en général les hébergeurs ne font pas spontanément. S'ils en sont d'accord,  il faudra veiller à mettre dans la copie du fichier de connexion l'adresse IP effective du serveur SQL, pas '''localhost''' ou '''127.0.0.1''' comme c'est souvent le cas dans l'original du fichier.

* rien n'indique si une base secondaire est gérée par SPIP ou non, aussi la compilation de squelettes contenant des {{{<BOUCLE(A:T)...}}} ne bénéficie pas des abréviations usuelles du site principal: il faut écrire le préfixe de table (donc {{{A:spip_articles}}} et pas {{{A:ARTICLES}}}), les jointures implicites ne fonctionneront pas (pas de critère '''id_article''' dans une boucle de documents etc) et autres facilités ('''id_secteur''' pour '''id_rubrique''' dans une boucle de brèves, les boucles SITES et HIERARCHIE ne seront pas comprises etc). On peut envisager un nouveau travail sur le compilateur de squelettes pour prendre en compte le cas, voire permettre la compilation d'un squelette local avec une directive générale indiquant que les tables concernées sont ailleurs. L'usage dira ce qu'il sera opportun de développer.

* la mise en oeuvre du multi-base telle que décrite sur [http://www.spip-contrib.net/MultiBase spip-contrib] est obsolète. Cette interface (qui remontait en fait à SPIP 1.8) obligeait à écrire plusieurs copies des mêmes fonctions (dans le cas d'un même serveur), mettait les identifants de connexion dans un répertoire non protégé par un Htacces (pas catastrophique, mais tout de même peu prudent) et obligeait à programmer soi-même la connexion à la base secondaire.

''Compatibilité'': pour ceux qui n'utilisaient ni les préfixes de tables, ni les connexions multiples, cette nouvelle interface sera transparente, sans nécessité de réinstallation. Pour les sites où le préfixe de table est égal au nom de la base également. Pour d'autres utilisations du préfixe de table, détruire le fichier '''connect.php''' et réinstaller. Pour les sites utilisant le multi-bases ancienne manière, lire ce qui suit.

Afin de permettre plusieurs connexions simultanément, les globales '''$table_prefixe, $spip_mysql_db, $spip_mysql_link, $db_ok''' perdent leurs rôles. Une nouvelle globale '''$connexions''' est introduite. C'est un tableau indexé par des noms conventionnels désignant les bases (noms qu'on utilisera dans les boucles des squelettes et comme suffixe du fichier '''connect''' correspondant), la base principale étant à l'index 0. Chacune des entrées de ces tableaux est elle-même un tableau ainsi formé:
{{{
	'db' => nom de la base SQL
	'prefixe' => préfixe des tables dans cette base
	'link' => Ressource indiquant la connexion persistance
	'count' => fonction d'abstraction du comptage de lignes dans 
	'countsel' => fonction d'abstraction pour l'opération COUNT(*)
	'create' => fonction d'abstraction pour la création de table
	'delete' => fonction d'abstraction pour la destruction de lignes
	'errno' =>  fonction d'abstraction pour le numéro d'erreur
	'error' =>  fonction d'abstraction pour le message d'erreur
	'fetch' =>  fonction d'abstraction pour l'extractation
	'fetsel' => fonction d'abstraction pour sélection puis extractation
	'free' => fonction d'abstraction pour la libération
	'insert' => fonction d'abstraction pour l'insertion
	'listdbs' => fonction d'abstraction pour lister les bases accessibles
	'multi' => fonction d'abstraction pour la balise multi
	'query' => fonction d'abstraction pour requête SQL standard
	'replace' => fonction d'abstraction pour remplacement
	'select' => fonction d'abstraction pour la sélection
	'selectdb' => fonction d'abstraction pour choisir une base
	'showtable' => fonction d'abstraction pour décrire une table
	'update' => fonction d'abstraction pour modifier une ligne
	'updateq' => idem, avec valeurs brutes (apostrophes rajoutés au besoin)
}}}
Ainsi, '''$GLOBALS['connexions'][0]['prefixe']''' est l'équivalent de l'ancien '''$table_prefix'''.

La fonction '''spip_connect_db''' admet à présent un argument supplémentaire, le préfixe des tables dans la base, qui par défaut est pris égal à la base. Elle est invoquée à l'installation et dans le fichier '''connect.php''' qui passe pour cette raison en version 0.6. Les fonctions '''spip_query''' et '''spip_connect''' conservent leur signatures, mais réalisent un travail figurant auparavant dans ''base_db_mysql_dist''' qu'il n'est ainsi plus nécessaire de recopier. A l'inverse, la fonction '''abstract_sql''' délègue la connexion à '''spip_connect''', ce qui impose de renommer les éventuels fichiers '''inc-connect'''X'''.php''' présents dans '''SPIP_PATH''' en '''connect'''X'''.php''' dans '''config''', mais l'essentiel de leur contenu (clône du fichier db_mysql.php) est à remplacer par un appel de '''spip_connect_db''', indiquant notamment le type du serveur (MySQL ou PG actuellement) le tableau ci-dessus dispensant de redonner ces fonctions.
parent a93fbcae
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Chargement en cours
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter