|
Программирование >> Программный интерфейс приложений
которые еще не обработаны */ argv += optind; /* функцией getopt long() */ if (argc > 0) db name = argv(0]; -argc; ++argv; if (ask password) password = get tty password (NOLL); conn = do connect (host name, user name, password, db name, port num, socket name, 0); if (conn == NOLL) exit (1); /* здесь размещается код, выполняющий основные операции */ do disconnect (conn); exit (0); По сравнению с программами clienti, client2 и clients, разработанными нами ранее, client4 имеет следующие особенности. Позволяет задавать имя базы данных прямо в командной строке. Это соответствует интерфейсу стандартных программ, которые поставляются с дистрибуцией СУБД MySQL. Удаляет любой пароль в векторе аргументов сразу же после его копирования. Таким образом, максимально уменьщается временной интервал, на протяжении которого пароль, заданный в командной строке, будет виден команде ps или другим профаммам, имеющим доступ к информации о состоянии системы. (Интервал уменьшается, а не офаничивается. И все же такой метод, при котором пароль задается в командной строке, остается очень рискованным с точки зрения безопасности.) Опция пароля может задаваться без значения. В таком случае клиент запрашивает пароль с помощью подпрограммы get tty password (). Эта подпрофамма из клиентской библиотеки запрашивает пароль, не повторяя его на экране. (В клиентской библиотеке таких штучек хватает. Рекомендуется также просмафивать исходные тексты профаммы СУБД MySQL. Это позволит узнать больше о возможностях этих подпрофамм.) Правомочен вопрос: почему просто не вызвать функцию getpass () ? Но далеко не все системы имеют эту функцию (в ОС Windows, например, такая возможность отсугствует). Функция getttypassword () работает в любой системе. Программа client4 работает в соответствии с заданными ей опциями. Для упрощения предположим, что конфигурационный файл отсутствует. Запустив client4 без аргументов, вы подключаетесь к узлу localhost без пароля, под именем, под которым вы зарегисфировались в ОС UNIX. Запустите client4 с помощью командной строки, приведенной ниже, программа запросит пароль (сразу же после ключа -р пароль отсутствует), соединит вас с узлом some host и передаст имя пользователя some user на сервер вместе с введенным вами паролем; % client4 -h some host -u some user -p some db Программа client4 передает имя базы данных some db на do connect О и делает ее текущей базой данных. Если конфип рационный файл существует, обрабатывается его содержимое, которое затем используется для соответствующего изменения параметров соединения. Ранее, создавая функции подключения и отключения от сервера, мы прибегали к модульному методу. Резонен вопрос, можно ли включить программный код, занимающийся анализом опций (ключей), в эти функции. Сделать это можно, но я не рекомендую. Программный код анализа опций не так постоянен, как код подключения. Профаммы часто поддерживают в дополнение к ставдартным опциям (ключа.м) дополнительные опции. Различные профаммы, вероятнее всего, поддерживают различные наборы дополнительных опций. Это делает затруднительным написание универсального процесса обработки опции. Кроме того, в отличие от процедуры установки соединения, которая может выполняться несколько раз во время выполнения профаммы, анализ опций производится только один раз в начале профаммы. Выполненная нами операция является универсальной для любой клиентской профаммы MySQL: подключение к серверу с помощью соответствующих парамефов. Конечно, необходимо знать, как подключаться. Но теперь вы уже это знаете и детали этого процесса реализованы в коде клиентской профаммы (client4.c), так что об этом можно уже не беспокоиться. Это значит, что можно полностью сфокусировать внимание на самом главном - возможности получить доступ к данным, хранящимся в базе данных. Все действия профаммы должны размещаться между вызовами do connect О И do disconnect {). Но то, что у нас уже есть, можно использовать в качестве основы для создания различных профамм. Для того чтобы написать новую профамму, необходимо выполнить следующее. 1. Скопировать client4 . с. 2. Внести изменения в цикл обработки парамефов, если будут задействованы другие или дополнительные ключи. 3. Добавить код, реализующий ващ алгоритм между вызовами do connect{) и do disconnect() . И все готово. Главное назначение заготовки клиентской профаммы заключается в том, что ее можно легко использовать для установки или разрыва соединения, а сам разработчик может сфокусировать свое внимание на том, что он действительно хочет сделать. Теперь это можно осуществить, тем самым демонсфируя довольно парадоксальный принцип, что дисциплина порождает свободу. Обработка запросов Теперь нам известно, как можно начать и закончить общение с сервером. Рассмотрим как ведет себя само соединение. Этот раздел демонстрирует процедуру общения с сервером при обработке запросов. Каждый запрос к базе данных предполагает выполнение следующих шагов. 1. Создать запрос. Как это делается, зависит от содержимого запроса, в частности, содержит ли он двоичные данные. 2. Сделать запрос, послав его на сервер. 3. Обработать результат запроса. Зависит от типа сделанного запроса. Например, оператор SELECT возвращает строки с данными. Оператор INSERT не возвращает. Очень важную роль при создании запросов выполняет функция, с помощью которой запросы будут посььтаться на сервер. Чаще всего используется подпрофаммы mysql real query (). С ИХ помощью запрос высылается в виде строки со счетчиком длины. Так как строка запроса передается вместе со счетчиком, ее содержимое может быть чем угодно, даже двоичными данными или пустыми байтами. В этом случае запрос не завершается символом NULL . Другая функция передачи запросов, mysql query (), более офаничена в своих возможностях, но при этом и более удобна в использовании. Запросы, которые передаются функции mysql query (), завершаются символом NULL , что означает, что такие запросы не могут содержать в себе символ NULL . (Наличие байтов со значением NULL просто приведет к ошибочной интерпретации их как более коротких, чем они есть на самом деле.) В общем, если запрос создается для того, чтобы передавать произвольные данные, и сушествует вероятность, что они будут содержать пустые байты, использования функции mysql query{) следует избегать. Существенным преимуществом использования сфок с офаничением символом NULL является возможность использования сфоковых функций, вероятно, хорошо уже вам знакомой стандартной библиотеки С, таких как strcpy () и sprintf (). Рассмотрим еще один фактор, с которым сталкиваешься при создании запросов: прибегаете ли вы к операциям, содержащим управляющие символы? Да, если создается запрос с использованием двоичных данных или других символов, таких как кавычки или обратная косая черта. Эта проблема будет обсуждаться в дальнейшем. Простейший набросок кода, обрабатывающего запрос, выглядит следуюшим образом: if {mysql query (conn, query) != 0) ( /* ошибка, сообщение об ошибке */ } else */ /* успешное выполнение; определить результаты выполнения запроса */
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |