| 24.2.2 Ajouter une nouvelle fonction définie par l'utilisateur ( UDF )
 24.2 Ajouter des fonctions à MySQL
 24 Etendre MySQL
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Fonctions utilisateur : appeler des fonctions simples
 . Appeler des fonctions utilisateurs pour les groupements
 . Traitement des arguments
 . Valeurs de retour et gestion d'erreurs.
 ->Compiler et installer des fonctions utilisateurs
 
 
 | 
  24.2.2.5 Compiler et installer des fonctions utilisateurs 
   Les fichiers qui implémentent des fonctions utilisateurs doivent être compilés
et installés sur le même hôte que celui du serveur. Ce processus est décrit plus
bas, avec le fichier  
udf_example.cc
  qui est inclut dans les sources  
MySQL
 .
Ce fichier contient les fonctions suivantes : 
Un fichier dynamiquement chargé doit être compilé sous la forme d'un
objet partagé, grâce à une commande comme celle-ci :
metaphon()
  retourne la version métaphone de la chaîne en argument.
C'est une technique proche du soundex, mais elle est bien plus optimisée pour
l'anglais.
myfunc_double()
  retourne la moyenne des codes ASCII des caractères de la chaîne
passée en argument.
myfunc_int()
  retourne la somme de tailles des arguments.
sequence([const int])
  retourne une séquence, commençant à partir du nombre
choisit ou 1, si aucun nombre n'a été fourni.
lookup()
  retourne l'adresse IP numérique d'un hôte.
reverse_lookup()
  retourne le nom d'hôte pour une adresse IP.
Cette fonction peut être appelée avec une chaîne au format  
"xxx.xxx.xxx.xxx"
  ou
quatre nombres.
 Vous pouvez facilement trouver les options correctes pour la compilation
en exécutant cette commande dans le dossier  
sql
  de votre installation
source :| 
shell> gcc -shared -o udf_example.so myfunc.cc
 | 
 Vous devez exécuter une commande de compilation similaire à celle que le 
 
make
  affiche, sauf que vous devrez supprimer l'option  
-c
  près
de la fin de la ligne, et ajouter  
-o udf_example.so
  à la fin de la ligne.
Sur certains systèmes, vous devrez aussi supprimer  
-c
  de la commande).| 
shell> make udf_example.o
 | 
 
Une fois que vous compilez un objet partagés contenant des fonctions utilisateurs,
vous devez les installer, et prévenir le serveur MYSQL. Compiler un objet partagé
avec  
udf_example.cc
  produit un fichier qui s'appelle
 
udf_example.so
  (le nom exact peut varier suivant la plate-forme).
Copiez ce fichier dans l'un des dossiers utilisé par  
ld
 , tel que
 
/usr/lib
 . Par exemple,  
/etc/ld.so.conf
 .
Sur de nombreux systèmes, vous pouvez faire pointer la  variable
d'environnement  
LD_LIBRARY
  ou  
LD_LIBRARY_PATH
  pour qu'elle pointe
dans le dossier où vous avez vos fichiers de fonctions. Le manuel de  
dlopen
  
vous indiquera quelle variable utiliser sur votre système. Vous devriez indiquer
cette valeur dans les options de démarrage de  
mysql.server
  et  
safe_mysqld
 ,
et redémarrer  
mysqld
 . 
Après que la bibliothèque ait été installée, indiquez à  
mysqld
  ces nouvelles
fonctions avec ces commandes :
 Les fonctions peuvent être effacées plus tard avec  
DROP FUNCTION
 :| 
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so";
 mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so";
 mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
 mysql> CREATE FUNCTION reverse_lookup
 ->        RETURNS STRING SONAME "udf_example.so";
 mysql> CREATE AGGREGATE FUNCTION avgcost
 ->        RETURNS REAL SONAME "udf_example.so";
 | 
 Les commandes  
CREATE FUNCTION
  et  
DROP FUNCTION
  modifient la 
table système  
func
  dans la base  
mysql
 . Le nom de la fonction,
son type et le nom de la bibliothèque partagée sont alors sauvés dans la table. Vous devez avoir
les droits de  
INSERT
  et  
DELETE
  dans la base  
mysql
  pour ajouter
et effacer des fonctions.Vous ne devez pas utiliser la commande  
CREATE FUNCTION
  pour ajouter une fonction
qui a déjà été créée. Si vous devez reinstaller une fonction, vous devez la supprimer
avec la commande  
DROP FUNCTION
  puis la reinstaller avec  
CREATE FUNCTION
 . 
Vous devrez faire cela, par exemple, si vous recompilez une nouvelle version de 
votre fonction, pour que  
mysqld
  utilise cette nouvelle version. Sinon,
le serveur va continuer à utiliser l'ancienne version.| 
mysql> DROP FUNCTION metaphon;mysql> DROP FUNCTION myfunc_double;
 mysql> DROP FUNCTION myfunc_int;
 mysql> DROP FUNCTION lookup;
 mysql> DROP FUNCTION reverse_lookup;
 mysql> DROP FUNCTION avgcost;
 | 
 
Les fonctions actives sont rechargées à chaque fois que le serveur démarre, à moins
que vous ne démarriez le serveur  
mysqld
  avec l'option  
--skip-grant-tables
 .
Dans ce cas, l'initialisation des fonctions utilisateurs sont ignorées, et ces
fonctions sont inutilisables. Une fonction active doit avoir été créée avec
 
CREATE FUNCTION
  et pas supprimée avec  
DROP FUNCTION
 .
 |