Программирование >>  Создание клиентов mysql 

1 ... 175 176 177 [ 178 ] 179 180 181 ... 201


ется с помощью инструкции CREATE FUNCTION. Первый способ менее удобен, поскольку приходится останавливать сервер и заменять его исполняемый файл. Так обычно поступают с функциями, которые планируется сделать частью проекта MySQL. Ниже будет рассмотрен второй подход.

В дистрибутив MySQL входит пример ункций. Он находится в файле sql/udf example. сс. В этом файле содержатся определения шести функций. Я скопировал из него строку, используемую утилитой make для правильного вызова компилятора языка С. В комментариях к файлу рекомендуется выполнить команду make udf example. сс, чтобы посмотреть параметры компиляции статического объектного файла, а затем заменить -о so. лис-

тинге 31.5 показана строка компиляции файла в моей системе в каталоге

программы MySQL.

с++ \

-DMYSQL SERVER \

-DDEFAULT MYSQL HOME= \ /usГ/local\ \

-DDATADIR= \ /usr/local/var\ \

-DSHAREDIR= \ /usr/local/share/mysql\ \

-DHAVE CONFIG H \

-DDBUG OFF \

-I../bdb/build unix \

-I../innobase/include \

-I./../include \

-I./../regex \

-I. \

-I../include \ -I. \

-03 \

-fno-implicit-templates \

-shared \

-o udf example.so \ udf example.cc

После компиляции совместно используемой библиотеки нужно скопировать ее в один из каталогов, перечисленных в файле Если каталог будет

другим, укажите его имя в переменной среды LD LIBRARY PATH.

Для активизации функции нужно выполнить инструкцию CREATE FUNCTION. В листинге 31.6демонстрируется загрузка функций METAPHON и AVGCOST из библиотеки В результате в таблице будут созданы две новые записи, и пока инструкция DROP FUNCTION их не удалит, функции останутся доступны всем пользователям даже в случае перезапуска сервера.

CREATE FUNCTION METAPHON

RETURNS STRING SONAME udf example.so ;

CREATE AGGREGATE FUNCTION AVGCOST

RETURNS REAL SONAME udf example, so ;



Создание функций 551

В библиотечном файле может содержаться одна или несколько функций. Язык реализации - С или С++. Каждой SQL-функции в этом файле соответствует как минимум одна функция с аналогичным именем. Кроме того, могут быть созданы функции с суффиксами init и deinit. Например, в файле udf example.cc содержатся определения функций metaphon (), metaphon init () Hmetaphon deinit (). Когда вводится инструкция, содержащая вызов UDF-функции, сначала происходит обращение к функции с суффиксом init. Затем для каждой записи выполняется основная функция. В конце вызывается функция с суффиксом deinit. Все три функции должны быть безопасны дж потоков. Это означает, что в них нельзя использовать глобальные переменные, меняющие свои значения. Функция с суффиксом init предназначена для динамического в1деления памяти, а функция с суффиксом de init освобождает вьщ еденную память.

Основная функция может возвращать значение с плавающей запятой, целое число или строку. В первом случае тип результата должен быть double, во втором - long, a в третьем - char *. В листинге 31.7 показано несколько прототипов функций.

char *metaphon{

UDF INIT *initid, UDF ARGS *args, char *result, unsigned long *length, char *is null, char *error);

long long sequence( UDF INIT *initid, UDF ARGS *args, char *is null, char *error);

double myfunc double( UDF INIT *initid, UDF ARGS *args, char *is null, char *error};

my bool metaphon init( UDF INIT *initid, UDF ARGS *args, char *message);

void metaphon deinit( UDF INIT *initid) ;

Числовые значения возвращаются непосредственно, а строковые - через указатели. Программа MySQL резервирует 255-символьный буфер для аргумента result. В аргументе lengthдолжен быть указан размер возвращаемого значения. Если размер превышает 255 байтов, нужно создать собственный буфер в инициализирующей функции и передать указатель на него в полг структуры UDF INIT. Описание полей структуры приведено в табл. 31.4.



Описание

Указывает то, может ли функция возвращать пустое значение. Если один из аргументов функции может быть пустым, в это поле будет записана единица

Содержит количество цифр после запятой, если функция возвращает числовое значение. Будет указана максимальная точность среди всех аргументов

Определяет максимальную длину возвращаемой строки

С помощью этого указателя осуществляется обмен данными между инициализирующей и

другими двумя функциями. Например, мвжно выделить блок памяти и записать сюда адрес этого блока

Если функция возвращает пустое значение, аргумент is null должен быть равен 1. В случае ошибки в аргумент error записывается значение 1. В результате текущая запись и все последующие станут пустыми.

Описание структуры UDFARGS приведено в табл. 31.5. Через эту структуру программа MySQL передает аргументы функции.

Поле

unsigned int decimals

unsigned in ength

char *ptr

Поле

unsigned int argcount enum Item result *arg type

char **args

Описание

Содержит число аргументов функции. Если это значение фиксировано, проверьте его в инициализирующей функции

Содержит массив типов аргументов. Возможные значения массива таковы: INTRESULT, REAL RESULT и STRING RESULT. Можно осуществлять проверку типов и в случае несовпадения либо возвращать признак ошибки, либо корректировать содержимое массива, приводя аргументы к нужному типу

Содержит массив значений аргументов. Если ар гумент является строкой, в массиве будет хра-питься указатель на строку. Длины строковых аргументов приведены в массиве lengths. Если ар гумент представляет собой целое число или число с плавающей запятой, приведите значение к типу long long или double соответственно



1 ... 175 176 177 [ 178 ] 179 180 181 ... 201

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика