Программирование >>  Программный интерфейс приложений 

1 ... 88 89 90 [ 91 ] 92 93 94 ... 264


/* show argv.c */ #include <stdio.h> #include <mysql.h>

char *groups[] = { client , NULL }; int

main {mt argc, char *argv[]) !

int i;

my init ();

printf ( Первоначальный вектор аргументов:\n ); for (1 = 0; i < argc; i++)

printf ( arg%d: %s\n , i, argv[i]);

load defaults ( my , groups, iargc, iargv);

printf ( Модифицированный вектор аргументов:\n );

for (i =0; 1 < argc; i++)

printf ( arg %d: %s\n , i, argv[i]);

exit {0 ) ;

Конфигурационный файл содержит следующие данные.

groups [ ] - это символьный массив, определяющий в каких группах конфигурационных файлов вы заинтересованы. Для клиентских программ как минимум определяется client (для группы [client]), а последний элемент обязательно должен иметь значение NULL .

Подпрограмма my init() является инициализирующей подпрограммой, выполняющей операции установки, необходимые подпрограмме load defaults().

Подпрограмма load def aults () принимает четыре аргумента: префикс конфигурационных файлов всегда должен бьпъ ту , массив с перечнем нужных фупп и адреса счетчика аргументов программы и вектора. Не передавайте значения счетчика и вектора непосредственно. Передавайте их адреса, потому что load def aults () должна менять их значения. Необходимо обратить внимание на следующее: несмотря на то, что argv является указателем, передается только &argv, или адрес указателя.

Подпрограмма showargv печатает свои аргументы дважды, первый раз, когда они определяются в командной строке, а потом по мере изменения подпрограммой load def aults (). Для того чтобы посмотреть, как работает подпрограмма load defaults (), убедитесь в том, что в ващем корневом каталоге существует файл .my.cnf с определенными установками для группы [client]. Предположим, что файл .my.cnf имеет следующий вид:

[client] user=paul password=secret host=some host



в этом случае выполнение подпрограммы showargv даст результат: % show argv а Ь

Первоначальный вектор аргументов

arg О arg 1 arg 2

show argv а b

Измененный вектор аргументов:

arg О arg 1 arg 2 arg 3 arg 4 arg 5

show argv

- -user=paul

- -password=secret

- -host=some host a

Возможно, что в вьгеоде постятся некоторые опции от showargv, которых нет в командной строке или в конфигурационном файле ~/ .ту. cnf. В таком случае, возможно, что это опции, заданные в общесистемном конфигурационном файле. Подпрофамма load defaults () в действительности сначала ищет файл /etc/my. cnf и my. cnf в каталоге данных СУБД MySQL и только потом читает файл .my.cnf в ващем пользовательском каталоге. (В ОС Windows подпрофамма load defaults () производит поиск в следующей последовательности C:\my.cnf, C:\mysql\data\my.cnf И файл ту. ini в системном каталоге ОС Windows.)

Клиентские программы, работающие с подпрограммой load def aults () , почти всегда определяют client в списке групп (таким образом, они всегда получают все общие установки клиентов из конфигурационного файла). Но может возникнуть необходимость в значениях, характерных только для ващей программы. Измените строку и вместо:

char *groups[] = { client , NOLL };

введите следующее:

char *groups[] = { show argv , client , NOLL );

После этого добавьте фуппу [showargv] в свой файл ~/ .my.cnf:

[client]

user=paul

password=secret

host=some host

[show argv]

host=other host

После внесения этих изменений повторный вызов show argv даст несколько другой результат:

% show argv а Ь

Первоначальный вектор аргументов arg 0: show argv arg 1: а arg 2: b

Измененный вектор аргументов: arg 0: show argv



arg 1 ang 2 arg 3 arg 4 arg 5 arg 6

- -user=paul

- -password=secret

- -host=some host

- -host=other host a

Порядок следования значений опций в массиве аргументов определяется порядком их следования в конфигурационном файле, а не порядком следования групп в массиве groups [ ]. Это означает, что вы, вероятно, хотите определить фуппы, которые характерны для данной программы, следующие за группой [client] в ващем конфигурационном файле. Таким образом, если определить опции в двух группах, преимуществом будут пользоваться опции, присущие данной программе. Это можно видеть по предьщущему примеру. Опция узла была задана как в группе [client], так и в группе [show argv], но так как фуппа [show argv] идет в конфигурационном файле последней, ее установки узла будут представлены позже в векторе.

Профамма load def aults () не выбирает значения из ваших установок среды. Для того чтобы воспользоваться переменными установки среды, такими как mysql tcp port или mysql unix port, обратитесь к программе getenv (). Такую возможность добавлять не будем, но пример проверки значений ряда стандартных переменных, связанных со средой MySQL, привести можно:

extern char *getenv ();

char *p;

int port num;

char *socket name;

if ((p = getenv { MYSQL TCP PORT )) != NULL)

port num = atoi (p); if ((p = getenv ( MYSQL UNIX PORT )) != NULL)

socket name = p;

В стандартных профаммах MySQL значения стандартных переменных среды имеют более низкий приоритет, чем значения, заданные в конфигурационных файлах или в командной сфоке. Если есть определенные сомнения в значениях, принимаемых переменными среды, проверьте все установки среды до (а не после) вызова подпрофаммы lQad defaults () или обработки опций командной сфоки.

Синтаксический анализ аргументов командной строки

Теперь можно получить все параметры в вектор аргументов, но как их теперь обрабатывать? Функция getopt long {) запрограммирована для выполнения этих задач.

Функция getopt lQng {) всфоена в клиентскую библиотеку СУБД MySQL, таким образом необходимо получить доступ к ней. В исходный



1 ... 88 89 90 [ 91 ] 92 93 94 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика