Processando Argumentos
O parâmetro args aponta para uma estrutura UDF_ARGS que tem os mambros listados abaixo:
unsigned int arg_countO 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_typeOs 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_typena 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_typecom 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 **argsargs->argsinforma 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 como3ou4*7-2ouSIN(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->argscontém os argumentos atuais que são passados pela linhas sendo processadas atualmente.As funções podem se referir a um argumento
icomo 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 *lengthsPara a função de inicialização, o vetor
lengthsindica o tamanho máximo da string para cada argumento. Você não deve alterá-los. Para cada chamada da função principal,lengthscontém o tamanho atual de quaisquer argumentos string que são passados para a linha sendo processada atualmente. Para argumentos do tipoINT_RESULTouREAL_RESULT,lengthsainda contém o tamanho máximo do argumento (como para a função de inicialização).