Файлы, реализующие UDFы, должны компилироваться и устанавливаться на
машине, где работает сервер. Эта процедура описана ниже для файла примеров
UDF udf_example.cc
, входящего в поставку исходного кода MySQL. Данный файл
содержит следующие функции:
metaphon()
возвращаетmetaphon
-строку для строкового аргумента. Эта строка в общем напоминаетsoundex
-строку, но более приспособлена для английского языка.myfunc_double()
возвращает отношение суммы ASCII-значений символов своих аргументов к суммарной длине аргументов.myfunc_int()
возвращает суммарную длину своих аргументов.sequence([const int])
возвращает последовательность, начиная с заданного номера, либо с 1, если номер не задан.lookup()
возвращает IP-адрес для имени удаленного компьютера.reverse_lookup()
возвращает имя удаленного компьютера для IP-адреса. Функция может вызываться для строки"xxx.xxx.xxx.xxx"
либо для четырех чисел.
Динамически загружаемый файл должен компилироваться как разделяемый объектный файл с помощью команды следующего вида:
shell> gcc -shared -o udf_example.so myfunc.cc
Корректные опции компилятора для своей системы можно легко получить,
запустив следующую команду в каталоге sql
дерева исходных текстов MySQL:
shell> make udf_example.o
Следует выполнить команду компиляции, подобную приведенной выше make
, с
той разницей, что надо удалить опцию -c
ближе к концу строки и добавить -o
udf_example.so
в конце строки (в некоторых системах, возможно, -c
придется
оставить в команде).
После компиляции разделяемого объектного файла, содержащего UDFы, следует
установить его и дать о нем знать MySQL. В результате компиляции
разделяемого объектного модуля из udf_example.cc
получается файл с именем
наподобие udf_example.so
(точное имя может на разных платформах может быть
различным). Скопируйте этот файл в какой-нибудь просматриваемый ld
каталог, вроде /usr/lib
. Во многих системах можно устанавливать переменную
окружения LD_LIBRARY
или LD_LIBRARY_PATH
для указания каталога, в котором
размещены файлы UDF-функций. В руководстве по dlopen
указывается, какую
переменную следует использовать в данной системе. Необходимо сделать
соответствующие установки в скриптах запуска mysql.server
или safe_mysqld
и перезапустить
mysqld
.
После установки библиотеки следует уведомить mysqld
о новых функциях
следующими командами:
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";
Функции могут быть удалены с помощью 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;
Команды CREATE FUNCTION
и DROP FUNCTION
обновляют системную таблицу func
в базе данных mysql
. В таблицу записываются имя функции, ее тип и имя
разделяемой библиотеки. Для создания и удаления функций необходимо
обладать привилегиями INSERT
и DELETE
для базы данных mysql
.
Недопустимо использовать CREATE FUNCTION
для добавления функции, которая
уже была создана. Если необходимо переустановить функцию, ее следует
удалить с помощью DROP FUNCTION
и затем переустановить посредством CREATE FUNCTION
. Эти действия приходится выполнять, например, когда компилируется
новая версия данной функции, и надо, чтобы mysqld
получил новую версию.
Иначе сервер будет продолжать пользоваться старой версией.
Активные функции подгружаются при каждом запуске сервера, за исключением
случая, когда mysqld
запускается с опцией --skip-grant-tables
. Тогда
инициализация UDF пропускается и UDFы недоступны (активная функция - это
функция, которая была загружена посредством CREATE FUNCTION
и не удалена с
помощью DROP FUNCTION
).