|
Программирование >> Создание клиентов mysql
ется с помощью инструкции 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 соответственно
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |