Los ficheros implementando UDFs deben compilarse e instalarse
en el equipo donde corre el servidor. Este proceso se describe
a continuación para el fichero UDF de ejemplo
sql/udf_example.cc
que se incluye en la
distribución fuente de MySQL.
Las instrucciones siguientes son para Unix. Las instructiones para Windows se dan posteriormente en esta sección.
El fichero udf_example.cc
contiene las
siguientes funciones:
metaphon()
retorna una cadena de
caracteres metaphon del argumento de cadena de caracteres.
Esto es algo como una cadena de caracteres soundex, pero
más ajustado al inglés.
myfunc_double()
retorna la suma de los
valores ASCII de los caracteres en los argumentos,
divididos por la suma de la longitud de los argumentos.
myfunc_int()
retorna la suma de la
longitud de los argumentos.
sequence([const int])
retorna una
secuencia empezando por el número dado o 1 si no se da
ningún número.
lookup()
retorna la IP para un nombre
de equipo.
reverse_lookup()
retorna el nombre de
equipo para una IP. La función puede llamarse con un
único argumento de cadena de caracteres de la forma
'xxx.xxx.xxx.xxx'
o con cuatro
números.
Un fichero cargable dinámicamente debe compilarse como fichero objeto compartible, usando un comando como:
shell> gcc -shared -o udf_example.so udf_example.cc
Si usa gcc, debe ser capaz de crear
udf_example.so
con un comando más
simple:
shell> make udf_example.so
Puede determinar fácilmente las opciones de compilación
adecuadas para su sistema ejecutando este comando en el
directorio sql
del árbol fuente de
MySQL:
shell> make udf_example.o
Debe ejecutar un comando de compilación similar al que
muestra make , excepto que debe quitar la
opción -c
cerca del final de la línea y
añadir -o udf_example.so
al final de la
línea. (En algunos sistemas, puede necesitar dejar
-c
en el comando.)
Tras compilar un objeto compartido conteniendo UDFs, debe
instalarlo y comunicarlo a MySQL. Compilar un objeto
compartido de udf_example.cc
produce un
fichero llamado algo como udf_example.so
(el nombre exacto puede variar de plataforma a plataforma).
Copie este fichero en un directorio como
/usr/lib
en el que busque el lincador
dinámico del sistema (en tiempo de ejecución), o añada el
directorio en el que está el objeto compartido en el fichero
de configuración del lincador (por ejemplo,
/etc/ld.so.conf
).
El nombre del lincador depende del sistema (por ejemplo, ld-elf.so.1 en FreeBSD, ld.so en Linux, o dyld en Mac OS X). Consulte su documentación del sistema para información acerca del nombre del lincador y cómo configurarlo.
En muchos sistemas, puede cambiar las variables de entorno
LD_LIBRARY
o
LD_LIBRARY_PATH
para que apunten al
directorio donde tiene los ficheros de su UDF. La página de
manual dlopen
explica qué variables debe
usar en su sistema. Debe inicializarla en los scripts de
arranque mysql.server o
mysqld_safe y reiniciar
mysqld.
En algunos sistemas, el programa ldconfig
que configura el lincador dinámico no reconoce un objeto
compartido a no ser que su nombre comience con
lib
. En ese caso debe renombar el fichero
como udf_example.so
a
libudf_example.so
.
En Windows, puede compilar funciones definidas por el usuario usando el siguiente procedimiento:
Necesita obtener el repositorio fuente BitKeeper para MySQL 4.0 o superior. Consulte Sección 2.8.3, “Instalar desde el árbol de código fuente de desarrollo”.
En el repositorio fuente, busque el directorio
VC++Files/examples/udf_example
. Hay
ficheros llamados udf_example.def
,
udf_example.dsp
, y
udf_example.dsw
.
En el repositorio fuente, busque en el directorio
sql
. Copie
udf_example.cc
de este directorio al
directorio
VC++Files/examples/udf_example
y
renombre el fichero a
udf_example.cpp
.
Abra el fichero udf_example.dsw
con
Visual Studio VC++ y úselo para compilar los UDFs como un
proyecto normal.
Cuando el objeto compartido se ha instalado, notifique a mysqld con las nuevas funciones con estos comandos:
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';
Las funciones pueden borrarse con DROP
FUNCTION
:
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;
Los comandos CREATE FUNCTION
y
DROP FUNCTION
actualizan la tabla de
sistema func
en la base de datos
mysql
. El nombre de función, tipo y
nombre de biblioteca compartida se salvan en la tabla. Debe
tener los privilegios INSERT
y
DELETE
para la base de datos
mysql
para crear y borrar funciones.
No debe usar CREATE FUNCTION
para añadir
una función que se ha creado préviamente. Si necesita
reinstalar una función, debe borrarla con DROP
FUNCTION
y reinstalarla con CREATE
FUNCTION
. Puede necesitar hacer esto, por ejemplo si
recompila una nueva versión de su función, de forma que
mysqld tenga la nueva versión. De otro
modo, el servidor continua usando la versión antigua.
Una función activa es una que se ha cargado con
CREATE FUNCTION
y no se ha borrado con
DROP FUNCTION
. Todas las funciones activas
se recargan cada vez que el servidor arranca, a no ser que
arranque mysqld con la opción
--skip-grant-tables
. En ese caso, la
inicialización de UDFs no se hace y no están disponibles.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.