Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MySQL. Библиотека профессионала - Аткинсон Л

..pdf
Скачиваний:
166
Добавлен:
24.05.2014
Размер:
10.41 Mб
Скачать

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, "Утилиты ко мандной строки".

544Глава Расширение возможностей MySQL

Втабл. 31.2 перечислены понимаемые отладчиком и передаваемые макросу

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

Флаг

Описание

 

 

d

 

Этот флаг разрешает выводить информацию макросам с

 

 

именами вида

Если список

 

 

чевых слов не указан, то подразумеваются все макросы.

 

 

Ключевые слова должны задаваться без префикса

D

время]

Этот флаг свидетельствует о том, что вывод отладочной

 

 

информации должен быть задержан на указанное число

 

 

десятых долей секунды. Например, флаг

означает,

 

 

что при выводе каждой строки будет выдерживаться пауза

 

 

длительностью 2,5секунды

 

 

f

функции]

Этот флаг разрешает выводить отладочную информацию

 

 

только из указанных функций. Например, флаг f

 

 

означает, что будут включены макросы, находящиеся в

 

 

теле функции main

 

 

F

 

Этот флаг указывает на то, что каждую строку отладочной

 

 

информации необходимо сопровождать именем

 

 

го файла

 

 

 

 

Этот флаг включает режим профилирования. В результа

 

 

те будет создан файл

out. В качестве аргумента

 

 

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

 

 

няется профилирование. В противном случае подразуме

 

 

ваются все функции. Более подробную информацию об

 

 

этом можно найти в файле

 

дистрибу

 

 

тива MySQL

 

 

 

 

Этот флаг указывает на то, что каждую строку отладочной

 

 

информации необходимо

сопровождать

 

 

 

ром процесса или потока, в зависимости от контекста

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

Этот флаг указывает на то, что каждую строку отладочной

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

Создание наборов символов 545

Флаг

Описание

 

 

 

N

Этот

включает нумерацию строк в файле отладки

о файл]

Этот флаг говорит о том, что отладочная информация

 

должна направляться в указанный файл. По умолчанию

 

эта информация отображается на экране, но многие кли

 

ентские программы изменяют данную

создавая

 

в каталоге

файл с именем программы и расширени

 

ем

 

 

 

О файл]

Этот флаг аналогичен флагу

но после каждой записи в

 

файл будет очищаться файловый буфер

 

процессы]

Этот флаг разрешает выводить отладочную информацию

 

только указанным процессам. Имя процесса должно быть

 

заданоспомощьюмакроса DBUG_PROCESS

 

Этот флаг указывает на то, что каждую

отладочной

 

информации необходимо сопровождать именем процесса

 

Этот флаг заставляет выравнивать выводимую информа

 

цию по левому краю экрана после

вызова макроса

S

При наличии этого флага отладчик будет вызывать функцию

 

(_file_, _line_)

для каждой

отлаживаемой

 

функции, пока первая невернет значение, отличное от нуля

Этот макрос включает вывод строк, помечающих точки вызова и завершения функций. Через запятую может быть указан максимальный уровень трассировки, по дос тижении которого отладочная и трассировочная инфор мация перестает выводиться

Исходная документация, написанная Фредом Фишем, находится в файле в исходном каталоге MySQL. С помощью утилиты этот файл можно преобразовать в формат Postscript или в текстовый формат.

Создание наборов символов

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

Конфигурационный файл для набора символов

 

 

 

 

 

 

 

Массив

 

 

(должен

содержать 257

 

 

 

 

 

 

 

 

00

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

20

20

20

20

20

20

20

20

20

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

84

84

84

84

84

84

84

84

84

84

10

10

 

10

 

10

10

10

10

81

81

81

81

81

81

01

01

01

01

01

 

01

 

01

01

01

01

01

01

01

01

01

01

01

01

01

01

10

 

10

 

10

10

10

10

82

82

82

82

82

82

02

02

02

02

02

 

02

 

02

02

02

02

02

02

02

02

02

02

02

02

02

02

10

 

10

 

10

10

20

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

 

00

 

00

00

00

48

10

10

10

10

10

10

10

10

10

10

10

 

10

 

10

10

10

10

10

10

10

10

10

10

10

10

10

10

10

 

10

 

10

10

10

01

01

01

01

01

01

01

01

01

01

01

01

 

01

 

01

01

01

01

01

01

01

01

01

01

10

01

01

01

01

 

01

 

01

01

02

02

02

02

02

02

02

02

02

02

02

02

02

 

02

 

02

02

02

02

02

02

02

02

02

02

10

02

02

02

02

 

02

 

02

02

02

Массив to_lower (должен содержать 256

 

 

 

 

 

 

 

 

00

01

02

03

04

05

06

07

08

09

 

 

ОС

 

 

 

OF

10

11

12

13

14

15

16

17

18

19

 

1C

 

 

 

 

20

21

22

23

24

25

26

27

28

29

 

 

2D

2F

30

31

32

33

34

35

36

37

38

39

ЗА

 

 

 

3D

 

3F

40

61

62

63

64

65

66

67

68

69

 

 

6D

6F

70

71

72

73

74

75

76

77

78

79

 

 

5D

5F

60

61

62

63

64

65

66

67

68

69

 

 

6D

6F

70

71

72

73

74

75

76

77

78

79

 

 

7D

7F

80

81

82

83

84

85

86

87

88

89

 

 

8D

8F

90

91

92

93

94

95

96

97

98

99

 

 

9D

9F

АО

А1

А2

A3

А4

А5

А6

А7

А8

А9

 

 

 

AC

AD

AF

ВО

В1

В2

 

В4

В5

В6

В7

В8

В9

 

 

 

 

 

 

BE

BF

 

Е1

 

 

Е4

Е5

 

Е7

Е8

Е9

 

ЕВ

ЕС

ED ЕЕ EF

 

 

F2

F3

F4

F5

F6

D7

F8

F9

FA

 

 

 

 

DF

ЕО

Е1

Е2

ЕЗ

Е4

Е5

Е6

Е7

Е8

Е9

ЕА

ЕВ

ЕС

ED

ЕЕ

EF

FO

Fl

F2

F3

F4

F5

F6

F7

F8

F9

FA

FB

FC

FD

FE

FF

Создание наборов символов 547

Массив

to_upper

(должен

содержать

256

 

 

 

 

 

 

00

01

02

03

04

05

06

07

08

09

 

ОС

 

 

OF

10

11

12

13

14

15

16

17

18

19

1C

 

 

 

20

21

22

23

24

25

26

27

28

29

2D

2F

30

31

32

33

34

35

36

37

38

39

ЗА

 

3D

 

3F

40

41

42

43

44

45

46

47

48

49

4D

4F

50

51

52

53

54

55

56

57

58

59

5D

5F

60

41

42

43

44

45

46

47

48

49

4D

4F

50

51

52

53

54

55

56

57

58

59

7D

7F

80

81

82

83

84

85

86

87

88

89

8D

8F

90

91

92

93

94

95

96

97

98

99

9D

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

ОА

ОС

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

ЗА

ЗС

3D

ЗЕ

3F

40

41

42

43

44

45

46

47

48

49

4A

4D

4F

50

51

52

53

 

55

56

57

58

59

5D

5F

60

41

42

43

44

45

46

47

48

49

4D

4F

50

51

52

53

54

55

56

57

58

59

7D

7F

80

81

82

83

84

85

86

87

88

89

8D

8F

90

91

92

93

94

95

96

97

98

99

9D

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

43

45

45

45

45

49

49

49

49

44

4F

4F

4F

4F

5D

D7

D8

55

55

55

59

59

DE

DF

41

41

41

41

43

45

45

45

45

49

49

49

49

44

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

цифра

548 Глава Расширение возможностей MySQL

Вторая группа значений представляет собой таблицу ASCII, предназначенную для перевода символов в нижний регистр. Например, символ в позиции 0x41 — это про писная буква но ей соответствует значение 0x61, т.е. строчная Третья группа значений определяет таблицу ASCII для перевода символов в верхний регистр. По следняя таблица задает порядок сортировки и обычно совпадает с третьей таблицей.

Если истинный порядок сортировки невозможно отразить в столь простой табли це, то необходимо написать специальные функции сортировки. Для этого нужно соз дать файл в каталоге strings дерева MySQL. Здесь же находятся файлы всех осталь ных наборов символов, например ctype big5 Программа MySQL ищет в этом файле пять функций и четыре массива. Имена всех функций и массивов включают стандартный префикс и название набора. В листинге 31.3 показаны прототипы функ ций и определения массивов для набора символов big5.

NEAR

NEAR

uchar NEAR

uchar NEAR

const char *ptr, ptr_length, escape, uint res_length, char char uint uint

const uchar * const uchar * s2)

int const uchar * int

const uchar * s2, int

int uchar * uchar *

int int

int uchar * dest, uchar * src,

int len)

Создание функций 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.