Processando Argumentos
O parâmetro args
aponta para uma estrutura UDF_ARGS
que tem os mambros listados abaixo:
unsigned int arg_count
O número de argumentos. Verifique o valor na função de inicialização se você quiser que ssua função seja chamada com um número específico de argumentos. For exemplo:
if (args->arg_count != 2) { strcpy(message,'XXX() requires two arguments'); return 1; }
enum Item_result *arg_type
Os tipos para cada argumento. Os valores de tipos possíveis são
STRING_RESULT
,INT_RESULT
, eREAL_RESULT
.Para ter certeza que os argumentos são de um tipo dado e retornar um erro se não forem, verifique o vetor
arg_type
na função de inicialização. Por exemplo:if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,'XXX() requires a string and an integer'); return 1; }
Como uma alternativa para exigir que os argumentos de sua função sejam de um tipo específico, você pode usar a função de inicialização para definir o elemento
arg_type
com o tipo que você quiser. Isto faz com que o MariaDB converta argumentos para aqueles tipo a cada chamada dexxx()
. Por exemplo, para fazer conversão dos dois primeiros argumentos para string e integer, faça isto comxxx_init()
:args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT;
char **args
args->args
informa a função de inicialização sobre a natureza geral dos argumentos chamados com sua função. Para um argumento constantei
,args->args[i]
aponta para o valor do argumento. (Veja abaixo sobre instruções de como acessar o valor de forma apropriada). Para um argumento não constante,args->args[i]
é0
. Um argumento constante é uma expressão é uma expressão que utiliza apenas constante, tais como3
ou4*7-2
ouSIN(3.14)
. Um argumento não constante é uma expressão que refere a valores que podem alterar a cada linha, tais como nomes de coluna ou funções que são chamadas com argumentos não contantes.Para cada chamada da função principal,
args->args
contém os argumentos atuais que são passados pela linhas sendo processadas atualmente.As funções podem se referir a um argumento
i
como a seguir:- Um argumento do tipo
STRING_RESULT
é dado como um apontador string mais um tamanho, para permitir o tratamento de dados binários de tamanho arbitrário. Os conteúdo da string estão disponíveis comoargs->args[i]
e o tamanho da string éargs->lengths[i]
. Você não deve assumir aue as strings são terminadas em null. - Para um argumnto do tipo
INT_RESULT
, você deve converterargs->args[i]
para um valorlong long
:long long int_val; int_val = *((long long*) args->args[i]);
- Para um argumento do tipo
REAL_RESULT
, você deve converterargs->args[i]
para um valordouble
:double real_val; real_val = *((double*) args->args[i]);
- Um argumento do tipo
unsigned long *lengths
Para a função de inicialização, o vetor
lengths
indica o tamanho máximo da string para cada argumento. Você não deve alterá-los. Para cada chamada da função principal,lengths
contém o tamanho atual de quaisquer argumentos string que são passados para a linha sendo processada atualmente. Para argumentos do tipoINT_RESULT
ouREAL_RESULT
,lengths
ainda contém o tamanho máximo do argumento (como para a função de inicialização).