MySQL. Библиотека профессионала - Аткинсон Л
..pdf
542 Глава
Расширение возможностей MySQL
Макрос |
Описание |
Этот макрос помечает указанную
меткой.
DBUG_FILE |
Эта макроконстанта инкапсулирует деск |
|
|
риптор выходного файла, в который за |
|
|
писываетсяотладочнаяинформация. |
|
значение) |
Если в программе используется функция |
|
|
замените ее данным макросом. |
|
DBUG_POP |
Этот макрос восстанавливает предыдущее |
|
|
состояние отладки. |
|
DBUG_PRINT |
Этот макрос записывает отладочную |
|
т аргументы] |
формацию в файловый поток, как если бы |
|
|
была вызвана функция |
с кон |
|
стантой DBUG_FILE в качестве дескрип |
|
|
тора. Первый |
это ключевое |
|
которое можно |
использовать с |
|
описанным ниже флагом |
Второй аргу |
|
это набор параметров, передавае |
|
|
мый функции fprintf |
|
DBUG_PROCESS |
Этот макрос задает имя текущего процесса. |
|
|
) |
|
DBUG_PUSH |
Этот макрос задает новые параметры для |
|
|
текущего сеанса отладки. Все они поме |
|
|
щаются в стек, поэтому можно восстанав |
|
ливать предыдущие состояния с помощью макроса DBUG_POP 
Библиотека функций отладки 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, "Утилиты ко мандной строки".
Создание наборов символов 545
Флаг |
Описание |
|
|
|
N |
Этот |
включает нумерацию строк в файле отладки |
||
о файл] |
Этот флаг говорит о том, что отладочная информация |
|||
|
должна направляться в указанный файл. По умолчанию |
|||
|
эта информация отображается на экране, но многие кли |
|||
|
ентские программы изменяют данную |
создавая |
||
|
в каталоге |
файл с именем программы и расширени |
||
|
ем |
|
|
|
О файл] |
Этот флаг аналогичен флагу |
но после каждой записи в |
||
|
файл будет очищаться файловый буфер |
|
||
процессы] |
Этот флаг разрешает выводить отладочную информацию |
|||
|
только указанным процессам. Имя процесса должно быть |
|||
|
заданоспомощьюмакроса DBUG_PROCESS |
|||
|
Этот флаг указывает на то, что каждую |
отладочной |
||
|
информации необходимо сопровождать именем процесса |
|||
|
Этот флаг заставляет выравнивать выводимую информа |
|||
|
цию по левому краю экрана после |
вызова макроса |
||
S |
При наличии этого флага отладчик будет вызывать функцию |
|||
|
(_file_, _line_) |
для каждой |
отлаживаемой |
|
|
функции, пока первая невернет значение, отличное от нуля |
|||
Этот макрос включает вывод строк, помечающих точки вызова и завершения функций. Через запятую может быть указан максимальный уровень трассировки, по дос тижении которого отладочная и трассировочная инфор мация перестает выводиться
Исходная документация, написанная Фредом Фишем, находится в файле 

в исходном каталоге MySQL. С помощью утилиты
этот файл можно преобразовать в формат Postscript или в текстовый формат.
Создание наборов символов
Допускается включать в программу MySQL новые наборы символов. Для простого, однобайтового набора требуется лишь один файл с четырьмя таблицами преобразо ваний. В случае сложного набора необходимо также написать функцию, выполняю щую сортировку строк.
Создание наборов символов 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 |
цифра |
Создание функций 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. Код функции компилируется в виде библиотечного модуля, который 
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 |
|
Создание функций 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.

Расширение возможностей MySQL
понимаемые отладчиком и передаваемые макросу
Они определяют, какая информация должна быть представлена в вы ходных данных. Строка формата выглядит как последовательность флагов, разделен ных двоеточиями. Некоторые флаги требуют наличия параметров. Например, флаг
принимает список ключевых слов, разделенных запятыми.
Расширение возможностей MySQL
но ей соответствует значение 0x61, т.е. строчная
Третья группа значений определяет таблицу ASCII для перевода символов в верхний регистр. По следняя таблица задает порядок сортировки и обычно совпадает с третьей таблицей.
Программа MySQL ищет в этом файле пять функций и четыре массива. Имена всех функций и массивов включают стандартный префикс и название набора. В листинге 31.3 показаны прототипы функ ций и определения массивов для набора символов big5.
ptr_length,
escape, uint res_length, char
char
uint
uint 
const uchar * s2)
const uchar *
int 

uchar *
uchar * 
uchar * dest, uchar * src,