Spec-Zone .ru
спецификации, руководства, описания, API
|
args
параметр указывает на a UDF_ARGS
структура,
которой перечисляли элементы здесь:
unsigned int arg_count
Число параметров. Проверьте это значение в функцию инициализации, если Вы требуете, чтобы Ваша функция была вызвана с определенным числом параметров. Например:
if (args->arg_count != 2){ strcpy(message,"XXX() requires two arguments"); return 1;}
Для другого UDF_ARGS
задействованные значения, которые являются
массивами, ссылки массива, основаны на нуле. Таким образом, отнеситесь, чтобы выстроить
задействованное использование, индексируют значения от 0 до args->arg_count
– 1.
enum Item_result *arg_type
Указатель на массив, содержащий типы для каждого параметра. Возможные значения типа STRING_RESULT
, INT_RESULT
, REAL_RESULT
, и DECIMAL_RESULT
.
Чтобы удостовериться, что параметры имеют данный тип и возвращают ошибку, если они не, проверьте
arg_type
массив в функции инициализации. Например:
if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT){ strcpy(message,"XXX() requires a string and an integer"); return 1;}
Параметры типа DECIMAL_RESULT
передаются как строки, таким образом,
следует обработать их тот же самый путь как STRING_RESULT
значения.
Как альтернатива требованию, чтобы параметры Вашей функции имели определенные типы, можно
использовать функцию инициализации, чтобы установить arg_type
элементы
к типам Вы хотите. Это заставляет MySQL принуждать параметры тем типам для каждого звонка xxx()
. Например, чтобы определить, что первые два параметра должны
быть принуждены, чтобы представить в виде строки и целое число, соответственно, прикончите это xxx_init()
:
args->arg_type[0] = STRING_RESULT;args->arg_type[1] = INT_RESULT;
Параметры десятичного числа точного значения такой как 1.3
или DECIMAL
значения столбцов передают с типом DECIMAL_RESULT
.
Однако, значения передают как строки. Если Вы хотите получить число, используйте функцию
инициализации, чтобы определить, что параметр должен быть принужден к a REAL_RESULT
значение:
args->arg_type[2] = REAL_RESULT;
char **args
args->args
передает информацию к функции инициализации об общем
характере параметров, которые передают к Вашей функции. Для постоянного параметра i
, args->args[i]
точки к значению
аргумента. (См. позже для инструкций по тому, как получить доступ к значению должным образом.) Для
непостоянного параметра, args->args[i]
0
. Постоянным параметром является выражение, которое использует
только константы, такой как 3
или 4*7-2
или SIN(3.14)
.
Непостоянным параметром является выражение, которое обращается к значениям, которые могут измениться
от строки до строки, такой как имена столбцов или функции, которые вызываются с непостоянными
параметрами.
Для каждого вызова основной функции, args->args
содержит фактические
параметры, которые передают для строки, в настоящий момент обрабатываемой.
Если параметр i
представляет NULL
, args->args[i]
нулевой указатель (0). Если параметр не NULL
, функции могут обратиться к этому следующим образом:
Параметр типа STRING_RESULT
дается как
указатель строки плюс длина, чтобы позволить обработать двоичных данных или данных
произвольной длины. Строковое содержание доступно как args->args[i]
и строковая длина args->lengths[i]
.
Не предполагайте, что строка завершается нулем.
Для параметра типа INT_RESULT
, следует
бросить args->args[i]
к a long
long
значение:
long long int_val;int_val = *((long long*) args->args[i]);
Для параметра типа REAL_RESULT
, следует
бросить args->args[i]
к a double
значение:
double real_val;real_val = *((double*) args->args[i]);
Для параметра типа DECIMAL_RESULT
,
значение передают как строка и должно быть обработано как a STRING_RESULT
значение.
ROW_RESULT
параметры не реализуются.
unsigned long *lengths
Для функции инициализации, lengths
массив указывает на максимальную
строковую длину для каждого параметра. Недопустимо изменить их. Для каждого вызова основной функции,
lengths
содержит фактические длины любых строковых параметров, которые
передают для строки, в настоящий момент обрабатываемой. Для параметров типов INT_RESULT
или REAL_RESULT
, lengths
все еще содержит
максимальную длину параметра (что касается функции инициализации).
char *maybe_null
Для функции инициализации, maybe_null
массив указывает для каждого
параметра, могло ли бы значение аргумента быть нулем (0 если не, 1 если да).
char **attributes
args->attributes
передает информацию об именах параметров UDF. Для
параметра i
, название атрибута доступно как строка в args->attributes[i]
и длина атрибута args->attribute_lengths[i]
.
Не предполагайте, что строка завершается нулем.
По умолчанию имя параметра UDF является текстом выражения, используемого, чтобы определить параметр.
Для UDFs у параметра может также быть дополнительное [AS]
пункт, когда имя параметра alias_name
alias_name
. attributes
значение для каждого параметра таким образом зависит от того, был ли псевдоним дан.
Предположите что UDF my_udf()
вызывается следующим образом:
SELECT my_udf(expr1, expr2 AS alias1, expr3 alias2);
В этом случае, attributes
и attribute_lengths
у массивов будут эти значения:
args->attributes[0] = "expr1"args->attribute_lengths[0] = 5args->attributes[1] = "alias1"args->attribute_lengths[1] = 6args->attributes[2] = "alias2"args->attribute_lengths[2] = 6
unsigned long *attribute_lengths
attribute_lengths
массив указывает на длину каждого имени параметра.