![](/user_photo/1438_p9ksI.png)
MySQL. Библиотека профессионала - Аткинсон Л
..pdf![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F541x1.jpg)
542 Глава Расширение возможностей MySQL
Макрос |
Описание |
Этот макрос помечает указанную
меткой.
DBUG_FILE |
Эта макроконстанта инкапсулирует деск |
|
|
риптор выходного файла, в который за |
|
|
писываетсяотладочнаяинформация. |
|
значение) |
Если в программе используется функция |
|
|
замените ее данным макросом. |
|
DBUG_POP |
Этот макрос восстанавливает предыдущее |
|
|
состояние отладки. |
|
DBUG_PRINT |
Этот макрос записывает отладочную |
|
т аргументы] |
формацию в файловый поток, как если бы |
|
|
была вызвана функция |
с кон |
|
стантой DBUG_FILE в качестве дескрип |
|
|
тора. Первый |
это ключевое |
|
которое можно |
использовать с |
|
описанным ниже флагом |
Второй аргу |
|
это набор параметров, передавае |
|
|
мый функции fprintf |
|
DBUG_PROCESS |
Этот макрос задает имя текущего процесса. |
|
|
) |
|
DBUG_PUSH |
Этот макрос задает новые параметры для |
|
|
текущего сеанса отладки. Все они поме |
|
|
щаются в стек, поэтому можно восстанав |
ливать предыдущие состояния с помощью макроса DBUG_POP
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F542x1.jpg)
Библиотека функций отладки 543
Макрос |
Описание |
Этот макрос заменяет инструкцию return. функция ничего не возвращает,
зуйтесь макросом
DBUG_SET |
Этот макрос заменяет функцию |
Этот макрос указывает на то, что функция не возвращает никаких значений
Отладка функции начинается с что в ее начало помещается макрос DBUG_ENTER
Затем все вызовы инструкции return заменяются либо макросом
либо
Это позволяет отладчику определять, когда управление передается тойилиинойфункции.
Макрос DBUG_EXECUTE помечает отдельную строку кода ключевым словом. Макрос
записывает сообщение в отладочный файл. Можно напрямую работать с этим файлом благодаря макроконстанте DBUG_FILE, в которой хранится его дескриптор.
В листинге показан пример отладки функции, которая вычисляет факториал заданного целого числа.
ttinclude <dbug.h>
value)
("find
factorial", if (value
1)
value 1);
("result is
Программа, работающая с библиотекой функций отладки, обычно начинает от ладку, вызывая макрос DBUG_PUSH Утилиты MySQL вкл ючают отладку, если полу чен соответствующий аргумент командной строки или если установлена специальная переменная среды. Об опциях
и I рассказывалось в главе 14, "Утилиты ко мандной строки".
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F543x1.jpg)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F544x1.jpg)
Создание наборов символов 545
Флаг |
Описание |
|
|
|
N |
Этот |
включает нумерацию строк в файле отладки |
||
о файл] |
Этот флаг говорит о том, что отладочная информация |
|||
|
должна направляться в указанный файл. По умолчанию |
|||
|
эта информация отображается на экране, но многие кли |
|||
|
ентские программы изменяют данную |
создавая |
||
|
в каталоге |
файл с именем программы и расширени |
||
|
ем |
|
|
|
О файл] |
Этот флаг аналогичен флагу |
но после каждой записи в |
||
|
файл будет очищаться файловый буфер |
|
||
процессы] |
Этот флаг разрешает выводить отладочную информацию |
|||
|
только указанным процессам. Имя процесса должно быть |
|||
|
заданоспомощьюмакроса DBUG_PROCESS |
|||
|
Этот флаг указывает на то, что каждую |
отладочной |
||
|
информации необходимо сопровождать именем процесса |
|||
|
Этот флаг заставляет выравнивать выводимую информа |
|||
|
цию по левому краю экрана после |
вызова макроса |
||
S |
При наличии этого флага отладчик будет вызывать функцию |
|||
|
(_file_, _line_) |
для каждой |
отлаживаемой |
|
|
функции, пока первая невернет значение, отличное от нуля |
Этот макрос включает вывод строк, помечающих точки вызова и завершения функций. Через запятую может быть указан максимальный уровень трассировки, по дос тижении которого отладочная и трассировочная инфор мация перестает выводиться
Исходная документация, написанная Фредом Фишем, находится в файле в исходном каталоге MySQL. С помощью утилиты
этот файл можно преобразовать в формат Postscript или в текстовый формат.
Создание наборов символов
Допускается включать в программу MySQL новые наборы символов. Для простого, однобайтового набора требуется лишь один файл с четырьмя таблицами преобразо ваний. В случае сложного набора необходимо также написать функцию, выполняю щую сортировку строк.
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F545x1.jpg)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F546x1.jpg)
Создание наборов символов 547
Массив |
to_upper |
(должен |
содержать |
256 |
|
|
|
|
|
|
|||||
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
|
0В |
ОС |
|
|
OF |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
1А |
1В |
1C |
|
|
|
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
2А |
2В |
2С |
2D |
2Е |
2F |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
ЗА |
3В |
|
3D |
|
3F |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
4А |
4В |
4С |
4D |
4Е |
4F |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
5А |
5В |
5С |
5D |
5Е |
5F |
60 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
4А |
4В |
4С |
4D |
4Е |
4F |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
5А |
7В |
7С |
7D |
7Е |
7F |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
8А |
8В |
8С |
8D |
8Е |
8F |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
9А |
9В |
9С |
9D |
9Е |
9F |
АО |
А1 |
А2 |
A3 |
А4 |
А5 |
А6 |
А7 |
А8 |
А9 |
|
|
AC |
AD |
AF |
|
ВО |
В1 |
В2 |
|
В4 |
|
В6 |
В7 |
В8 |
В9 |
|
|
|
|
BE |
BF |
СО |
С1 |
С2 |
|
С4 |
С5 |
С6 |
С7 |
С8 |
С9 |
|
|
|
CD |
|
CF |
DO |
|
D2 |
D3 |
D4 |
D5 |
D6 |
D7 |
D8 |
D9 |
DA |
|
DC |
|
|
|
CO |
|
C2 |
C3 |
C4 |
C5 |
C6 |
C7 |
C8 |
C9 |
СА |
СВ |
СС |
CD |
CE |
CF |
DO |
Dl |
D2 |
D3 |
D4 |
D5 |
D6 |
F7 |
D8 |
D9 DA DB DC DD DE |
|
|||||
Массив sort_order (должен содержать 256 |
|
|
|
|
|
||||||||||
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
ОА |
0В |
ОС |
OD |
OE |
OF |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
1A |
|
1C |
|
|
|
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
2A |
2B |
2C |
2D |
2E |
2F |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
ЗА |
3В |
ЗС |
3D |
ЗЕ |
3F |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
4A |
4В |
4С |
4D |
4Е |
4F |
50 |
51 |
52 |
53 |
|
55 |
56 |
57 |
58 |
59 |
5А |
5В |
5С |
5D |
5Е |
5F |
60 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
4А |
4В |
4С |
4D |
4Е |
4F |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
5А |
7В |
7С |
7D |
7Е |
7F |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
8А |
8В |
8С |
8D |
8Е |
8F |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
9А |
9В |
9С |
9D |
9Е |
9F |
АО |
А1 |
А2 |
A3 |
А4 |
А5 |
А6 |
А7 |
А8 |
А9 |
АА |
АВ |
AC |
AD |
AE |
AF |
ВО |
В1 |
В2 |
ВЗ |
В4 |
В5 |
В6 |
В7 |
В8 |
В9 |
ВА |
ВВ |
ВС |
BD |
BE |
BF |
41 |
41 |
41 |
41 |
5С |
5В |
5С |
43 |
45 |
45 |
45 |
45 |
49 |
49 |
49 |
49 |
44 |
4Е |
4F |
4F |
4F |
4F |
5D |
D7 |
D8 |
55 |
55 |
55 |
59 |
59 |
DE |
DF |
41 |
41 |
41 |
41 |
5С |
5В |
5С |
43 |
45 |
45 |
45 |
45 |
49 |
49 |
49 |
49 |
44 |
4Е |
4F |
4F |
4F |
4F |
5D |
F7 |
D8 |
55 |
55 |
55 |
59 |
59 |
DE |
FF |
Десятичное значение |
|
значение Описание |
1 |
0x01 |
Прописная буква |
2 |
0x02 |
Строчная буква |
4 |
0x04 |
Цифра |
8 |
0x08 |
Символ пробела |
16 |
0x10 |
Знак пунктуации |
32 |
0x20 |
Управляющий символ |
64 |
0x40 |
Пусто |
128 |
0x80 |
цифра |
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F547x1.jpg)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F548x1.jpg)
Создание функций 549
Четыре функции осуществляют сравнение строк. Функция с префиксом находит наименьшую и наибольшую строки (с учетом
соответствующие выражению в
LIKE. Само выражение передается в аргументе
Аргумент ptr_length определяет длину выражения. Содержимое наименьшей и наибольшей строк заносится в аргументыmin_str
max_str соответственно.
Функции с префиксами и
служат аналогами обыч ных функций
и
языка С, которые, в свою очередь, являются версиями функций
и
учитывающими региональные установки. Функции с префиксами
и
эмулируют стандартные функции
и
Получить о них более подробную информацию можно в man файлахUNIX.
В начало файла нужно добавить комментарий, подобный тому, что показан в листин ге 31.4. На основании строк, приведенных в комментарии, сценарий включает набор символов в клиентскую библиотеку. Переменная
зада ется в том случае, когда у набора символов есть свои функции сортировки строк. Она оп ределяет максимальный коэффициент удлинения
при ее прохождении через функцию с префиксом
Как следует из листинга, строки в кодировке big5 не растягиваются.
Если в набор входят многобайтовые символы, потребуется определить перемен ную Она задает максимально возможное число байтов в представ лении символа. Например, в набор big5 входят двухбайтовые символы.
Эти строки анализируются сценарием configure при создании файла поэтому не меняйте их без веских оснований.
Все, что осталось теперь сделать, — это добавить имя набора в списки CHARSETS_ AVAILABLE и COMPILED_CHARSETS в файле и перекомпилировать программу. Активизировать доступные наборы символов можно с помощью опций командной строки, конфигурационного файла или SQL инструкций, как рассказыва лось в главах 13, "Инструкции SQL", и 14, "Утилиты командной строки".
Создание функций
В программу MySQL можно добавить новые функции, которые будут ваться точно так
как и встроенные функции, описанные в главе
"Встроенные функции". Существуют два способа создания таких функций. Первый — это включение функции непосредственно в исходный код
второй — определение функции в формате
(User Definable
пользовательская функция). Второй способ подходит, когда функцию требуется хранить и отлаживать отдельно от утилит MySQL. Код функции компилируется в виде библиотечного модуля, который
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F549x1.jpg)
550 Глава Расширение возможностей MySQL
с помощью инструкции CREATE FUNCTION. Первый способ менее удобен, по скольку приходится останавливать сервер и заменять его исполняемый файл. Так обычно поступают с функциями, которые планируется сделать частью проекта MySQL. Ниже будет рассмотрен второй подход.
В дистрибутив MySQL входит пример Он находится в
В этом файле содержатся определения шести функций. Я
пировал из него строку, используемую утилитой make для правильного вызова компиля тора языка С. В комментариях к файлу рекомендуется выполнить команду make
чтобы посмотреть параметры компиляции статического объектного файла, а затем заменить
о
so.
лис тинге 31.5 показанастрока компиляции файла в моей системе
в каталоге
программы MySQL.
с++ \
DMYSQL_SERVER \
\
\
\
\DDBUG_OFF \
\
\
\
\ I. \
\ I.
\
03 \
\ shared \
\
После компиляции совместно используемой библиотеки нужно скопировать ее в
один из каталогов, перечисленных в файле |
Если каталог будет |
другим, укажите его имя в переменной среды |
|
Для активизации функции нужно выполнить инструкцию CREATE FUNCTION. В листинге 31.6демонстрируется загрузка функций METAPHON и AVGCOST из библио
теки |
В результате в таблице |
будут созданы две новые за |
писи, и пока инструкция DROP FUNCTION их не удалит, функции останутся доступны |
||
всем пользователям даже в случае перезапуска сервера. |
|
|
CREATE FUNCTION METAPHON |
|
|
RETURNS |
STRING |
|
CREATE AGGREGATE FUNCTION AVGCOST |
|
|
RETURNS |
REAL SONAME |
|
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F550x1.jpg)
Создание функций 551
В библиотечном файле может содержаться одна или несколько функций. Язык реали зации— С или C++. Каждой в этом файле соответствует как минимум одна функция с аналогичным именем. Крометого, могут быть созданы функции с суффиксами _init и _deinit. Например, в файле
содержатся определения функ ций
metaphon_init
и
Когда вводится инструкция, содержащая вызов
сначала происходит обращение к функции с суффиксом
Затем для каждой записи выполняется основная функция. В конце вызывается функция с суффиксом
Все три функции должны быть безопасны для потоков. Это означает, что в них нельзя использовать глобальные переменные, меняющие свои значения. Функция с суффиксом _init предназначена для динамического выделения па мяти, а функция с
освобождаетвыделеннуюпамять.
Основная функция может возвращать значение с плавающей запятой, целое число или строку. В первом случае тип результата должен быть double, во втором — long, a в третьем — char В листинге 31.7 показано несколько прототипов функций.
char
UDF_INIT *initid, UDF_ARGS *args, char *result,
unsigned long char *is_null,
char
long long UDF_INIT *initid, UDF_ARGS *args, char *is_null, char
double myfunc_double UDF_INIT *initid, UDF_ARGS *args, char *is_null, char
UDF_INIT *initid, UDF_ARGS *args, char
void UDF_INIT
Числовые значения возвращаются непосредственно, а строковые — через указате ли. Программа MySQL резервирует буфер для аргумента result. В аргументе lengthдолжен быть указан размер возвращаемого значения. Если раз мер превышает 255 байтов, нужно создать собственный буфер в инициализирующей функции и передать указатель на него в поле
структуры UDF_INIT. Описание по лей структуры приведено в табл. 31.4.