В MySQL входит configure с опцией –with_debug. Если в распоряжении имеется бинарный дистрибутив, проверьте версию какого либо исполняемого файла. Программы, скомпилированные с поддержкой отладки, имеют суффикс –debug. mysqlclient. Макросы библиотеки объявлены в файле dbug.h.
Названия всех макросов начинаются с префикса DBUG_ (табл. 13.1). Если нужно отключить отладку, определите макроконстанту DBUG_OFF. При ее наличии все остальные макросы игнорируются.
| Макрос | Описание |
|---|---|
DBUG ENTER (функция) |
Этот макрос принимает имя функции, в которую входит программа. Его нужно указывать после объявления локальных переменных, но перед вызовом каких либо инструкций. Например: DBUG ENTER ("main") |
DBUG EXECUTE (ключевое слово) |
Этот макрос помечает указанную инструкцию меткой. Например: DBUG EXECUTE ("where", print where(tmp,"cache")); |
DBUG FILE |
Эта макроконстанта инкапсулирует дескриптор выходного файла, в который записывается отладочная информация. Например: sprintf (DBUG FILE, "\nWHERE:(%s)" , info) ; |
DBUG LONGJMP (среда, значение) |
Если в программе используется функция LONGJMP(), замените ее данным макросом. |
DBUG POP () |
Этот макрос восстанавливает предыдущее состояние отладки. DBUG POP (); |
DBUG_PRINT (ключевое слово, формат, [аргументы]) |
Этот макрос записывает отладочную информацию в файловый поток, как если бы была вызвана функция fprintf с константой DBUG_FILE в качестве дескриптора. Первый это ключевое слово которое можно использовать с описанным ниже флагом d. Второй аргумент — это набор параметров, передаваемый функции fprintf. Например: DBUG_PRINT ("mfunkt" , ("name: "%s"" , name)); |
DBUG PROCESS (имя) |
Этот макрос задает имя текущего процесса. Например: DBUG PROCESS (argv [0] ); |
DBUG PUSH (формат) |
Этот макрос задает новые параметры для текущего сеанса отладки. Все они помещаются в стек, поэтому можно восстанавливать предыдущие состояния с помощью макроса DBUG POP (). Например: DBUG PUSH (" d:t "); |
DBUG RETURN (значение) |
Этот макрос заменяет инструкцию return. Если функция ничего не возвращает, пользуйтесь макросом DBUG VOID RETURN (). |
DBUG SET JMP (среда) |
Этот макрос заменяет функцию setjmp (). |
DBUG VOID RETURN |
Этот макрос указывает на то, что функция не возвращает никаких значений |
Отладка функции начинается с того, что в ее начало помещается макрос DBUG ENTER(). Затем все вызовы инструкции return заменяются либо макросом DBUG ENTER(), либо DBUG VOID RETURN. Это позволяет отладчику определять, когда управление передается той или иной функции.
Макрос DBUG EXECUTE() помечает отдельную строку кода ключевым словом. Макрос DBUG PRINT записывает сообщение в отладочный файл. Можно напрямую работать с этим файлом благодаря макроконстанте DBUG FILE, в которой хранится его дескриптор.
В листинге показан пример отладки функции, которая вычисляет факториал заданного целого числа.
ttinclude <dbug.h>
int factorial (register int value)
{
DBUG ENTR ("factorial");
DBUG PRINT ("find", ("find %d factorial", value));
if (value > 1)
{
value *= factorial (value - 1);
}
DBUG ENTR ("result", ("result %d", value));
DBUG RETURN (value);
}
Программа, работающая с DBUG PUSH(). Утилиты MySQL включают отладку, если получен соответствующий аргумент командной строки или если установлена специальная переменная среды.
В табл. 13.2 перечислены флаги, понимаемые отладчиком и передаваемые макросу DBUG PUSH (). Они определяют, какая информация должна быть представлена в выходных данных. Строка формата выглядит как последовательность флагов, разделенных двоеточиями. Некоторые флаги требуют наличия параметров. Например, флаг d принимает список ключевых слов, разделенных запятыми.
| Флаг | Описание |
|---|---|
d [, ключевые слова] |
Этот флаг разрешает выводить информацию макросам с именами вида DBUG ключевое слово. Если список ключевых слов не указан, то подразумеваются все макросы. Ключевые слова должны задаваться без префикса DBUG. |
D [,время] |
Этот флаг свидетельствует о том, что вывод отладочной информации должен быть задержан на указанное число десятых долей секунды. Например, флаг D, 25 означает, что при выводе каждой строки будет выдерживаться пауза длительностью 2,5 секунды. |
f [,функции] |
Этот флаг разрешает выводить отладочную информацию только из указанных функций. Например, флаг f main означает, что будут включены макросы, находящиеся в теле функции main (). |
F |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать именем исходного файла. |
g |
Этот флаг включает режим профилирования. В результате будет создан файл dbugmon.out. В качестве аргумента может быть указан список функций, для которых выполняется профилирование. В противном случае подразумеваются все функции. Более подробную информацию об этом можно найти в файле dbug/readme.prof дистрибутива MySQL |
i |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать идентификатором процесса или потока, в зависимости от контекста. |
L |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать номером строки исходного файла. |
n |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать информацией о глубине вызова текущей функции. |
N |
Этот флаг включает нумерацию строк в файле отладки. |
о [, файл] |
Этот флаг говорит о том, что отладочная информация должна направляться в указанный файл. По умолчанию эта информация отображается на экране, но многие клиентские программы изменяют данную установку, создавая в каталоге /tmp файл с именем программы и расширением .Trace. |
О [, файл] |
Этот флаг аналогичен флагу o, но после каждой записи в файл будет очищаться файловый буфер |
P [, процессы] |
Этот флаг разрешает выводить отладочную информацию только указанным процессам. Имя процесса должно быть задано с помощью макроса DBUG_PROCESS |
Р |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать именем процесса |
r |
Этот флаг заставляет выравнивать выводимую информацию по левому краю экрана после вызова макроса DBUG PUSH (). |
S |
При наличии этого флага отладчик будет вызывать функцию sanity(file, line) для каждой отлаживаемой функции, пока первая не вернет значение, отличное от нуля |
t [, уровень] |
Этот макрос включает вывод строк, помечающих точки вызова и завершения функций. Через запятую может быть указан максимальный уровень трассировки, по достижении которого отладочная и трассировочная информация перестает выводиться. |
Исходная документация, написанная Фредом Фишем, находится в файле dbug/user.r в исходном каталоге MySQL. С помощью утилиты nroff этот файл можно преобразовать в формат Postscript или в текстовый формат.
Допускается включать в программу MySQL новые наборы символов. Для простого, однобайтового набора требуется лишь один файл с четырьмя таблицами преобразований. В случае сложного набора необходимо также написать функцию, выполняющую сортировку строк.
# конфигурационный файл для набора символов latinl.
# массив ctype{} (должен содержать 257 элементов).
00 20 20 20 20 20 20 20 20 20 28 28 28 28 28 28 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
... ... ... ...
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
# Массив to lower (должен содержать 256 элементов).
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
... ... ... ...
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
# Массив to upper (должен содержать 256 элементов).
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
... ... ... ...
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF
# Массив sort order (должен содержать 256 элементов).
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
... ... ... ...
41 41 41 41 5C 5B 5C 43 45 45 45 45 49 49 49 49
44 4E 4F 4F 4F 4F 5D F7 D8 55 55 55 59 59 DE FF
Десятичное значение Шестнадцатеричное значение Описание
1 0х01 прописная буква
2 0х02 строчная буква
4 0х04 цифра
8 0х08 символ пробела
16 0х10 знак пунктуации
32 0х20 управляющий символ
64 0х40 пусто
128 0х80 шестнадцатеричная цифра
Вторая группа значений представляет собой таблицу ASCII, предназначенную для перевода символов в нижний регистр. Например, символ в позиции 0x41 — это прописная буква "A", но ей соответствует значение 0x61, т.е. строчная "a". Третья группа значений определяет таблицу ASCII для перевода символов в верхний регистр. Последняя таблица задает порядок сортировки и обычно совпадает с третьей таблицей.
Если истинный порядок сортировки невозможно отразить в столь простой таблице, то необходимо написать специальные функции сортировки. Для этого нужно создать файл в каталоге strings дерева MySQL. Здесь же находятся файлы всех остальных наборов символов, например, ctype_big5.c. Программа MySQL ищет в этом файле пять функций и четыре массива. Имена всех функций и массивов включают стандартный префикс и название набора. В листинге 13.3 показаны прототипы функций и определения массивов для набора символов big5.
uchar NEAR ctype big5{257}
uchar NEAR to lower big5{}
uchar NEAR to upper{257}
uchar NEAR sort order big5{257}
my bool my like range big5(
const char *ptr,
uint ptr length,
pchar escape,
uint ers length,
char *min str,
char *max str,
uint *min length,
uint *max length)
int my strcoll big5(
const uchar * s1,
const uchar * s2)
int my strnncoll big5(
const uchar * s1,
int len1,
const uchar * s2
int len2)
int my strnxfrm big5(
uchar * dest,
uchar * src,
int len,
int srclen)
int my strxfrm big5(
uchar * dest,
uchar * src,
int len)
Четыре функции осуществляют сравнение строк. Функция с префиксом my like range находит наименьшую и наибольшую строки (с учетом реестра), соответствующие выражению в операторе LIKE. Само выражение передается в аргументе ptr. Аргумент ptr length определяет длину выражения. Содержимое наименьшей и наибольшей строк заносится в аргументы min str и max str соответственно.
Функции с префиксами my strcoll и my strncoll служат аналогами обычных функций strcoll() и strncoll() языка С, которые, в свою очередь, являются версиями функций и , учитывающими региональные установки. Функции с префиксами my strxfrn и my strnxfrn эмулируют стандартные функции strxfrn() и strnxfrn(). Получить о них более подробную информацию можно в man файлах UNIX.
В начало файла нужно добавить комментарий, подобный тому, что показан в листинге 13.4. На основании строк, приведенных в комментарии, сценарий configure включает набор символов в клиентскую библиотеку. Переменная strxfrn multiply набор задается в том случае, когда у набора символов есть свои функции сортировки строк. Она определяет максимальный коэффициент удлинения строки при ее прохождении через функцию с префиксом my strxfrm. Как следует из листинга, строки в кодировке big5 не растягиваются.
Если в набор входят многобайтовые символы, потребуется определить переменную mbmaxlen набор. Она задает максимально возможное число байтов в представлении символа. Например, в набор big5 входят двухбайтовые символы.
/* Эти строки анализируются сценарием configure при создании файла ctype.c, поэтому не меняйте их без веских оснований. .configure. strxfrm multiply big5=1 .configure. mbmaxlen big5=2 /*
Все, что осталось теперь сделать, — это добавить имя набора в списки CHARSETS AVAILABLE и COMPILED CHARSETS в файле configure.ini и перекомпилировать программу. Активизировать доступные наборы символов можно с помощью опций командной строки, конфигурационного файла или SQL инструкций.
В программу MySQL можно добавить новые функции, которые будут использоваться точно так же, как и встроенные функции. Существуют два способа . Первый способ менее удобен, поскольку приходится останавливать сервер и заменять его исполняемый файл. Так обычно поступают с функциями, которые планируется сделать частью проекта MySQL. Ниже будет рассмотрен второй подход.
В дистрибутив MySQL входит пример sql/. В этом файле содержатся определения шести функций. Я скопировал из него строку, используемую утилитой make для правильного вызова компилятора языка С. В комментариях к файлу рекомендуется выполнить команду make , чтобы посмотреть параметры компиляции статического
c++ \ -DMYSQL SERVER \ -DDEFAUT MYSQL HOME="\"/usr/local\"" \ -DDATADIR="\"/usr/local/share/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.cc
После компиляции совместно используемой библиотеки нужно скопировать ее в один из каталогов, перечисленных в /etc/ld.so.conf файле. Если каталог будет другим, укажите его имя в переменной среды LD LIBRARY PATH.
Для активизации функции нужно выполнить инструкцию . В листинге 13.6 демонстрируется загрузка функций METAPHON и AVGCOST из библиотеки . В результате в таблице mysql.func будут созданы две новые записи, и пока инструкция DROP FUNCTION их не удалит, функции останутся доступны всем пользователям даже в случае перезапуска сервера.
CREATE FUNCTION METAPHON RETURNS STRING SONAME "udf example.so"; CREATE AGGREGATE FUNCTION AVGCOST RETURNS REAL SONAME "udf example.so";
В библиотечном файле может содержаться одна или несколько функций. Язык реализации — С или C++. Каждой SQL-функции в этом файле соответствует как минимум одна функция с аналогичным именем. Кроме того, могут быть init и deinit. Например, в файле содержатся определения функций metaphon (), metaphon init () и metaphon deinit (). Когда вводится инструкция, содержащая вызов, сначала происходит обращение к функции с суффиксом init. Затем для каждой записи выполняется основная функция. В конце вызывается функция с суффиксом deinit. Все три функции должны быть безопасны для потоков. Это означает, что в них нельзя использовать глобальные переменные, меняющие свои значения. Функция с суффиксом _init предназначена для deinit освобождает
выделенную память.
Основная функция может возвращать значение с плавающей запятой, целое число или строку. В первом случае тип результата должен быть double, во втором — long, a в третьем — char *. В листинге 13.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 байтов, нужно создать собственный буфер в инициализирующей функции и передать указатель на него в поле ptr структуры UDF_INIT. Описание полей структуры приведено в табл. 13.4.
| Поле | Описание |
|---|---|
my bool maybe null |
Указывает на то, может ли функция возвращать пустое значение. Если один из аргументов функции может быть пустым, в это поле будет записана единица |
unsigned int decimals |
Содержит количество цифр после запятой, если функция возвращает числовое значение. Будет указана максимальная точность среди всех аргументов |
unsigned int max length |
Определяет максимальную длину возвращаемой строки |
char *ptr |
С помощью этого указателя осуществляется обмен данными между инициализирующей функцией и другими двумя функциями. Например, можно выделить блок памяти и записать сюда адрес этого блока |
Если функция возвращает пустое значение, аргумент is_null должен быть равен 1. В случае ошибки в аргумент error записывается значение 1. В результате текущая запись и все последующие станут пустыми.
Описание структуры UDF_ARGS приведено в табл. 13.5. Через эту структуру программа MySQL передает аргументы функции.
unsigned int arg_count |
Содержит число аргументов функции. Если это значение фиксировано, проверьте его в инициализирующей функции |
enum Item_result *arg_type |
Содержит массив типов аргументов. Возможные значения массива таковы: INT_RESULT, REAL RESULT и STRING RESULT. Можно осуществлять проверку типов и в случае несовпадения либо возвращать признак ошибки, либо корректировать содержимое массива, приводя аргументы к нужному типу |
char **args |
Содержит массив значений аргументов. Если аргумент является строкой, в массиве будет храниться указатель на строку. Длины строковых аргументов приведены в массиве lengths. Если аргумент представляет собой целое число или long или double соответственно |
unsigned long *lengths |
Содержит массив длин аргументов. В инициализирующей функции эти значения устанавливаются по максимуму на основании |
Процедуры MySQL выполняют операции над результатами запросов. Процедура активизируется при наличии в конце инструкции SELECT ключевого слова PROCEDURE. В настоящий момент в MySQL входит единственная процедура . Разрешается создавать собственные процедуры, включая их в программу на этапе компиляции.
Процедуры появились в MySQL версии 3.21, но пока что не вызвали особого энтузиазма. Писать их оказалось слишком сложно для большинства пользователей. Например, для Procedure. Код последнего находится в файлах sql / procedure.h и sql / procedure c.c. Процедура sql/sql_analyse_c.c.
С другой стороны можно воспользоваться библиотекой mylua (www.fastflow.it/ mylua) которая позволяет динамически загружать процедуры, написанные на языке LUA (www.lua.org). Для запуска сценария LUA в MySQL нужно вызвать функцию LUA() указав ей имя исходного файла, где содержится определение процедуры.
В MySQL входит configure с опцией –with_debug. Если в распоряжении имеется бинарный дистрибутив, проверьте версию какого либо исполняемого файла. Программы, скомпилированные с поддержкой отладки, имеют суффикс –debug. mysqlclient. Макросы библиотеки объявлены в файле dbug.h.
Названия всех макросов начинаются с префикса DBUG_ (табл. 13.1). Если нужно отключить отладку, определите макроконстанту DBUG_OFF. При ее наличии все остальные макросы игнорируются.
| Макрос | Описание |
|---|---|
DBUG ENTER (функция) |
Этот макрос принимает имя функции, в которую входит программа. Его нужно указывать после объявления локальных переменных, но перед вызовом каких либо инструкций. Например: DBUG ENTER ("main") |
DBUG EXECUTE (ключевое слово) |
Этот макрос помечает указанную инструкцию меткой. Например: DBUG EXECUTE ("where", print where(tmp,"cache")); |
DBUG FILE |
Эта макроконстанта инкапсулирует дескриптор выходного файла, в который записывается отладочная информация. Например: sprintf (DBUG FILE, "\nWHERE:(%s)" , info) ; |
DBUG LONGJMP (среда, значение) |
Если в программе используется функция LONGJMP(), замените ее данным макросом. |
DBUG POP () |
Этот макрос восстанавливает предыдущее состояние отладки. DBUG POP (); |
DBUG_PRINT (ключевое слово, формат, [аргументы]) |
Этот макрос записывает отладочную информацию в файловый поток, как если бы была вызвана функция fprintf с константой DBUG_FILE в качестве дескриптора. Первый это ключевое слово которое можно использовать с описанным ниже флагом d. Второй аргумент — это набор параметров, передаваемый функции fprintf. Например: DBUG_PRINT ("mfunkt" , ("name: "%s"" , name)); |
DBUG PROCESS (имя) |
Этот макрос задает имя текущего процесса. Например: DBUG PROCESS (argv [0] ); |
DBUG PUSH (формат) |
Этот макрос задает новые параметры для текущего сеанса отладки. Все они помещаются в стек, поэтому можно восстанавливать предыдущие состояния с помощью макроса DBUG POP (). Например: DBUG PUSH (" d:t "); |
DBUG RETURN (значение) |
Этот макрос заменяет инструкцию return. Если функция ничего не возвращает, пользуйтесь макросом DBUG VOID RETURN (). |
DBUG SET JMP (среда) |
Этот макрос заменяет функцию setjmp (). |
DBUG VOID RETURN |
Этот макрос указывает на то, что функция не возвращает никаких значений |
Отладка функции начинается с того, что в ее начало помещается макрос DBUG ENTER(). Затем все вызовы инструкции return заменяются либо макросом DBUG ENTER(), либо DBUG VOID RETURN. Это позволяет отладчику определять, когда управление передается той или иной функции.
Макрос DBUG EXECUTE() помечает отдельную строку кода ключевым словом. Макрос DBUG PRINT записывает сообщение в отладочный файл. Можно напрямую работать с этим файлом благодаря макроконстанте DBUG FILE, в которой хранится его дескриптор.
В листинге показан пример отладки функции, которая вычисляет факториал заданного целого числа.
ttinclude <dbug.h>
int factorial (register int value)
{
DBUG ENTR ("factorial");
DBUG PRINT ("find", ("find %d factorial", value));
if (value > 1)
{
value *= factorial (value - 1);
}
DBUG ENTR ("result", ("result %d", value));
DBUG RETURN (value);
}
Программа, работающая с DBUG PUSH(). Утилиты MySQL включают отладку, если получен соответствующий аргумент командной строки или если установлена специальная переменная среды.
В табл. 13.2 перечислены флаги, понимаемые отладчиком и передаваемые макросу DBUG PUSH (). Они определяют, какая информация должна быть представлена в выходных данных. Строка формата выглядит как последовательность флагов, разделенных двоеточиями. Некоторые флаги требуют наличия параметров. Например, флаг d принимает список ключевых слов, разделенных запятыми.
| Флаг | Описание |
|---|---|
d [, ключевые слова] |
Этот флаг разрешает выводить информацию макросам с именами вида DBUG ключевое слово. Если список ключевых слов не указан, то подразумеваются все макросы. Ключевые слова должны задаваться без префикса DBUG. |
D [,время] |
Этот флаг свидетельствует о том, что вывод отладочной информации должен быть задержан на указанное число десятых долей секунды. Например, флаг D, 25 означает, что при выводе каждой строки будет выдерживаться пауза длительностью 2,5 секунды. |
f [,функции] |
Этот флаг разрешает выводить отладочную информацию только из указанных функций. Например, флаг f main означает, что будут включены макросы, находящиеся в теле функции main (). |
F |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать именем исходного файла. |
g |
Этот флаг включает режим профилирования. В результате будет создан файл dbugmon.out. В качестве аргумента может быть указан список функций, для которых выполняется профилирование. В противном случае подразумеваются все функции. Более подробную информацию об этом можно найти в файле dbug/readme.prof дистрибутива MySQL |
i |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать идентификатором процесса или потока, в зависимости от контекста. |
L |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать номером строки исходного файла. |
n |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать информацией о глубине вызова текущей функции. |
N |
Этот флаг включает нумерацию строк в файле отладки. |
о [, файл] |
Этот флаг говорит о том, что отладочная информация должна направляться в указанный файл. По умолчанию эта информация отображается на экране, но многие клиентские программы изменяют данную установку, создавая в каталоге /tmp файл с именем программы и расширением .Trace. |
О [, файл] |
Этот флаг аналогичен флагу o, но после каждой записи в файл будет очищаться файловый буфер |
P [, процессы] |
Этот флаг разрешает выводить отладочную информацию только указанным процессам. Имя процесса должно быть задано с помощью макроса DBUG_PROCESS |
Р |
Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать именем процесса |
r |
Этот флаг заставляет выравнивать выводимую информацию по левому краю экрана после вызова макроса DBUG PUSH (). |
S |
При наличии этого флага отладчик будет вызывать функцию sanity(file, line) для каждой отлаживаемой функции, пока первая не вернет значение, отличное от нуля |
t [, уровень] |
Этот макрос включает вывод строк, помечающих точки вызова и завершения функций. Через запятую может быть указан максимальный уровень трассировки, по достижении которого отладочная и трассировочная информация перестает выводиться. |
Исходная документация, написанная Фредом Фишем, находится в файле dbug/user.r в исходном каталоге MySQL. С помощью утилиты nroff этот файл можно преобразовать в формат Postscript или в текстовый формат.
Допускается включать в программу MySQL новые наборы символов. Для простого, однобайтового набора требуется лишь один файл с четырьмя таблицами преобразований. В случае сложного набора необходимо также написать функцию, выполняющую сортировку строк.
# конфигурационный файл для набора символов latinl.
# массив ctype{} (должен содержать 257 элементов).
00 20 20 20 20 20 20 20 20 20 28 28 28 28 28 28 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
... ... ... ...
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
# Массив to lower (должен содержать 256 элементов).
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
... ... ... ...
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
# Массив to upper (должен содержать 256 элементов).
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
... ... ... ...
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF
# Массив sort order (должен содержать 256 элементов).
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
... ... ... ...
41 41 41 41 5C 5B 5C 43 45 45 45 45 49 49 49 49
44 4E 4F 4F 4F 4F 5D F7 D8 55 55 55 59 59 DE FF
Десятичное значение Шестнадцатеричное значение Описание
1 0х01 прописная буква
2 0х02 строчная буква
4 0х04 цифра
8 0х08 символ пробела
16 0х10 знак пунктуации
32 0х20 управляющий символ
64 0х40 пусто
128 0х80 шестнадцатеричная цифра
Вторая группа значений представляет собой таблицу ASCII, предназначенную для перевода символов в нижний регистр. Например, символ в позиции 0x41 — это прописная буква "A", но ей соответствует значение 0x61, т.е. строчная "a". Третья группа значений определяет таблицу ASCII для перевода символов в верхний регистр. Последняя таблица задает порядок сортировки и обычно совпадает с третьей таблицей.
Если истинный порядок сортировки невозможно отразить в столь простой таблице, то необходимо написать специальные функции сортировки. Для этого нужно создать файл в каталоге strings дерева MySQL. Здесь же находятся файлы всех остальных наборов символов, например, ctype_big5.c. Программа MySQL ищет в этом файле пять функций и четыре массива. Имена всех функций и массивов включают стандартный префикс и название набора. В листинге 13.3 показаны прототипы функций и определения массивов для набора символов big5.
uchar NEAR ctype big5{257}
uchar NEAR to lower big5{}
uchar NEAR to upper{257}
uchar NEAR sort order big5{257}
my bool my like range big5(
const char *ptr,
uint ptr length,
pchar escape,
uint ers length,
char *min str,
char *max str,
uint *min length,
uint *max length)
int my strcoll big5(
const uchar * s1,
const uchar * s2)
int my strnncoll big5(
const uchar * s1,
int len1,
const uchar * s2
int len2)
int my strnxfrm big5(
uchar * dest,
uchar * src,
int len,
int srclen)
int my strxfrm big5(
uchar * dest,
uchar * src,
int len)
Четыре функции осуществляют сравнение строк. Функция с префиксом my like range находит наименьшую и наибольшую строки (с учетом реестра), соответствующие выражению в операторе LIKE. Само выражение передается в аргументе ptr. Аргумент ptr length определяет длину выражения. Содержимое наименьшей и наибольшей строк заносится в аргументы min str и max str соответственно.
Функции с префиксами my strcoll и my strncoll служат аналогами обычных функций strcoll() и strncoll() языка С, которые, в свою очередь, являются версиями функций и , учитывающими региональные установки. Функции с префиксами my strxfrn и my strnxfrn эмулируют стандартные функции strxfrn() и strnxfrn(). Получить о них более подробную информацию можно в man файлах UNIX.
В начало файла нужно добавить комментарий, подобный тому, что показан в листинге 13.4. На основании строк, приведенных в комментарии, сценарий configure включает набор символов в клиентскую библиотеку. Переменная strxfrn multiply набор задается в том случае, когда у набора символов есть свои функции сортировки строк. Она определяет максимальный коэффициент удлинения строки при ее прохождении через функцию с префиксом my strxfrm. Как следует из листинга, строки в кодировке big5 не растягиваются.
Если в набор входят многобайтовые символы, потребуется определить переменную mbmaxlen набор. Она задает максимально возможное число байтов в представлении символа. Например, в набор big5 входят двухбайтовые символы.
/* Эти строки анализируются сценарием configure при создании файла ctype.c, поэтому не меняйте их без веских оснований. .configure. strxfrm multiply big5=1 .configure. mbmaxlen big5=2 /*
Все, что осталось теперь сделать, — это добавить имя набора в списки CHARSETS AVAILABLE и COMPILED CHARSETS в файле configure.ini и перекомпилировать программу. Активизировать доступные наборы символов можно с помощью опций командной строки, конфигурационного файла или SQL инструкций.
В программу MySQL можно добавить новые функции, которые будут использоваться точно так же, как и встроенные функции. Существуют два способа . Первый способ менее удобен, поскольку приходится останавливать сервер и заменять его исполняемый файл. Так обычно поступают с функциями, которые планируется сделать частью проекта MySQL. Ниже будет рассмотрен второй подход.
В дистрибутив MySQL входит пример sql/. В этом файле содержатся определения шести функций. Я скопировал из него строку, используемую утилитой make для правильного вызова компилятора языка С. В комментариях к файлу рекомендуется выполнить команду make , чтобы посмотреть параметры компиляции статического
c++ \ -DMYSQL SERVER \ -DDEFAUT MYSQL HOME="\"/usr/local\"" \ -DDATADIR="\"/usr/local/share/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.cc
После компиляции совместно используемой библиотеки нужно скопировать ее в один из каталогов, перечисленных в /etc/ld.so.conf файле. Если каталог будет другим, укажите его имя в переменной среды LD LIBRARY PATH.
Для активизации функции нужно выполнить инструкцию . В листинге 13.6 демонстрируется загрузка функций METAPHON и AVGCOST из библиотеки . В результате в таблице mysql.func будут созданы две новые записи, и пока инструкция DROP FUNCTION их не удалит, функции останутся доступны всем пользователям даже в случае перезапуска сервера.
CREATE FUNCTION METAPHON RETURNS STRING SONAME "udf example.so"; CREATE AGGREGATE FUNCTION AVGCOST RETURNS REAL SONAME "udf example.so";
В библиотечном файле может содержаться одна или несколько функций. Язык реализации — С или C++. Каждой SQL-функции в этом файле соответствует как минимум одна функция с аналогичным именем. Кроме того, могут быть init и deinit. Например, в файле содержатся определения функций metaphon (), metaphon init () и metaphon deinit (). Когда вводится инструкция, содержащая вызов, сначала происходит обращение к функции с суффиксом init. Затем для каждой записи выполняется основная функция. В конце вызывается функция с суффиксом deinit. Все три функции должны быть безопасны для потоков. Это означает, что в них нельзя использовать глобальные переменные, меняющие свои значения. Функция с суффиксом _init предназначена для deinit освобождает
выделенную память.
Основная функция может возвращать значение с плавающей запятой, целое число или строку. В первом случае тип результата должен быть double, во втором — long, a в третьем — char *. В листинге 13.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 байтов, нужно создать собственный буфер в инициализирующей функции и передать указатель на него в поле ptr структуры UDF_INIT. Описание полей структуры приведено в табл. 13.4.
| Поле | Описание |
|---|---|
my bool maybe null |
Указывает на то, может ли функция возвращать пустое значение. Если один из аргументов функции может быть пустым, в это поле будет записана единица |
unsigned int decimals |
Содержит количество цифр после запятой, если функция возвращает числовое значение. Будет указана максимальная точность среди всех аргументов |
unsigned int max length |
Определяет максимальную длину возвращаемой строки |
char *ptr |
С помощью этого указателя осуществляется обмен данными между инициализирующей функцией и другими двумя функциями. Например, можно выделить блок памяти и записать сюда адрес этого блока |
Если функция возвращает пустое значение, аргумент is_null должен быть равен 1. В случае ошибки в аргумент error записывается значение 1. В результате текущая запись и все последующие станут пустыми.
Описание структуры UDF_ARGS приведено в табл. 13.5. Через эту структуру программа MySQL передает аргументы функции.
unsigned int arg_count |
Содержит число аргументов функции. Если это значение фиксировано, проверьте его в инициализирующей функции |
enum Item_result *arg_type |
Содержит массив типов аргументов. Возможные значения массива таковы: INT_RESULT, REAL RESULT и STRING RESULT. Можно осуществлять проверку типов и в случае несовпадения либо возвращать признак ошибки, либо корректировать содержимое массива, приводя аргументы к нужному типу |
char **args |
Содержит массив значений аргументов. Если аргумент является строкой, в массиве будет храниться указатель на строку. Длины строковых аргументов приведены в массиве lengths. Если аргумент представляет собой целое число или long или double соответственно |
unsigned long *lengths |
Содержит массив длин аргументов. В инициализирующей функции эти значения устанавливаются по максимуму на основании |
Процедуры MySQL выполняют операции над результатами запросов. Процедура активизируется при наличии в конце инструкции SELECT ключевого слова PROCEDURE. В настоящий момент в MySQL входит единственная процедура . Разрешается создавать собственные процедуры, включая их в программу на этапе компиляции.
Процедуры появились в MySQL версии 3.21, но пока что не вызвали особого энтузиазма. Писать их оказалось слишком сложно для большинства пользователей. Например, для Procedure. Код последнего находится в файлах sql / procedure.h и sql / procedure c.c. Процедура sql/sql_analyse_c.c.
С другой стороны можно воспользоваться библиотекой mylua (www.fastflow.it/ mylua) которая позволяет динамически загружать процедуры, написанные на языке LUA (www.lua.org). Для запуска сценария LUA в MySQL нужно вызвать функцию LUA() указав ей имя исходного файла, где содержится определение процедуры.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.