Compilando e Instalando Funções Definidas Por Usuário
Arquivos implementando UDFs devem ser compilados e instalados na máquina onde o servidor está sendo executado. Este processo é descrito abaixo pelo arquivo UDF exemplo udf_example.cc
que é incluído na distribuição fonte do MariaDB. Este arquivo contém as seguintes funções:
metaphon()
retorna uma string metafonica do argumento string. Ela é algo como uma string soundex, mas é mais voltada para o inglês.myfunc_double()
retorna a soma de valores ASCII de caracteres e seus argumentos, dividido pela soma de tamanho de seus argumentos.myfunc_int()
retorna a soma do tamanho de seus argumentos.sequence([const int])
retorna uma sequência iniciando a partir de um número dado ou 1 se nenhum número for fornecido.lookup()
retorna o IP de um nome de máquina.reverse_lookup()
retorna o nome de mauina para um número IP. A função pode ser chamada com uma string'xxx.xxx.xxx.xxx'
ou quatro números.
A arquivo carregável dinamicamente deve ser compilado como um arquivo objeto compartilhável usando um comando como este:
shell> gcc -shared -o udf_example.so myfunc.cc
Você pode encontrar facilmente as opções de compilador corretas para seu sistema executando este comando no diretório sql
da sua árvore de fonte MySQL:
shell> make udf_example.o
Você deve executar comando de compilador similar àquele que o make
mostra, exceto que você deve remover a opção -c
próxima ao fim da linha e adicionar -o udf_example.so
. (Em alguns sistemas você pode precisar deixar o comando -c
.)
Uma vez que você tenha compilado um objeto compartilhado contendo UDFs, você deve instalá-lo e avisar o MariaDB sobre ele. Compilar um objeto compartilhado de udf_example.cc
produz um arquivo com nome parecido com udf_example.so
(o nome exato pode variar de plataforma para plataforma). Copie este arquivo para algum diretório procurado com o ligador dinâmico ld
, tal como /usr/lib
ou adicione o diretório no qual você colocou o objeto compartilhado ao arquivo de configuração do ligador (e.g. /etc/ld.so.conf
).
Em muitos sistemas você pode as variáveis de ambiente LD_LIBRARY
ou LD_LIBRARY_PATH
para apontar para o diretório onde se encontra os seus arquivos de funções UDF. A página dlopen
do manual diz a você quais variáveis você deve utilizar em seu sistema. Você deve configurar isto nos scripts de inicialização mysql.server
ou mysqld_safe
e reiniciar o mysqld
.
Depois da biblioteca ser instalada, notifique mysqld
sobre as novas funções com estes 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';
Funções podem ser deletadas utilizando-se 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;
As instruções CREATE FUNCTION
e DROP FUNCTION
atualizam a tabela de sistema func
no banco de dados MariaDB
. O nome da função, tipo e biblioteca compartilhada são salvas na tabela. Você deve ter os privilégios INSERT
e DELETE
para o banco de dados MariaDB
para criar e deletar funções.
Você não deve usar CREATE FUNCTION
para adicionar uma função que já tenha sido criada. Se você precisar reinstalar uma função, você deve removê-la com DROP FUNCTION
e então reinstalá-la com CREATE FUNCTION
. Você precisaria fazer isto, por exemplo, se você recompilar uma nova versão da sua função, assim o mysqld
obtem a nova versão. Por outro lado, o servidor continuará a utilizar a versão antiga.
Funções ativas são recarregadas a cada vez que o servidor inicia, a menos que você inicie mysqld
com a opção --skip-grant-tables
. Neste caso, a a inicialização de UDF é ignorada e as UDFs ficam indisponíveis. Uma função ativa é aquela que carregada com CREATE FUNCTION
e não removida com DROP FUNCTION
.)