|
Программирование >> Программный интерфейс приложений
в остальных сценариях обработки командной строки, которые приводятся в этой главе, будут использоваться стандартная процедура установки и разрыва соединений. Я только один раз покажу, как это делается, чтобы потом полностью сконцентрироваться на том, для чего был создан каждый конкретный сценарий в отдельности: #! /usr/bm/perl use DBI; use strict; # Синтаксический анализ параметров соединения из командной строки, если таковые присутствуют use Getopt::Long; $Getopt::Long::ignorecase =0; # опции чувствительны к регистру # параметры по умолчанию - все пропускается ту ($host name, $user name, $password) = (undef, undef, undef); # GetOptions не позволяет применять форму -uuser name, а только -и user name? GetOptions( # =s означает, что необходим строковый аргумент после опции liostli=s => \$liost name useru=s => \$user name # :s означает, что строковый аргумент после опции можно не указывать ,password p:s => \$password ) or exit (1); # запрос пароля, если опция определена, но значение отсутствует if (defined ($password) !$password) # отключить эхо open (TTY, /dev/tty ) or die Терминал не открывается\п ; system ( stty -eclio < /dev/tty ); print STDERR Ввести пароль: ; cliomp ($pas sword = <TTY>) ; system ( stty eclio < /dev/tty ); close (TTY); print STDERR \n ; # создание источника данных my ($dsn) = DBI:mysql:samp db ; $dsn .= :liostname=$liost name if $liost name; $dsn .= ;mysql read default file=$ENV{HOME}/.my.cnf ; # подключение к серверу my (%attr) = ( RaiseError => 1 ); my ($dbli) = DBI->connect ($dsn, $user name, $password, \%attr) ; Этот код инициализирует интерфейс DBI, принимает параметры соединения из командной строки, а затем с помощью параметров, полученных из командной строки или из конфигурационного файла -/.my.cnf пользователя, запустившего сценарий, осуществляет соединение с сервером MySQL. Это значит, что если в корневом каталоге такого пользователя имеется конфигурационный файл .my.cnf, то дополнительно вводить параметры соединения нет необходимости. (Только нужно не забывать установить такой режим, который обеспечит защиту этого файла от чтения. Инструкции по этому поводу можно найти в приложении Д, Программы MySQL .) Финальная часть нашего сценария будет очень похожа на окончания многих других сценариев. Она просто завершает сеанс связи и работу сценария: $dbh->disconnect {); exit (8); Когда мы перейдем к разделу, повествующему о программировании в Web, Работа с интерфейсом DBI в Web-приложениях , код установки соединения будет немного видоизменен, но основная идея останется прежней. Отладка При отладке сценария DBL работающего неправильно, прибегают к двум методам, применяя их каждый отдельно или оба сразу. Во-первых, можно разместить в различных местах сценария операторы печати. Это позволяет создавать удобную отладочную диагностику, но вводить эти операторы приходится вручную. Во-вторых, можно использовать встроенные средства трассировки интерфейса DBI. Это более универсальная возможность, но и более систематическая, запускаемая автоматически при ее включении. Трассировка интерфейса DB1 отображает информацию о работе самого драйвера, которую невозможно получить иным путем. Отладка с использованием операторов печати в вопросах, поступающих в список рассылки СУБД MySQL, одним из самых часто встречающихся является: У меня есть запрос, который отлично работает при запуске из mysql, но совсем не работает из сценария DB1. Что мне делать? Очень часто оказывается, что сценарий DB1 генерирует запрос, совершенно отличный от того, чего ожидает создавший его программист. И, если запрос распечатать до его отсылки на сервер, будет очень интересно увидеть, что собственно посылается на сервер. Предположим, что при запуске запроса из mysql, который выглядит следующим образом (без двоеточия в конце): INSERT member (last name, first name, expiration) VALUES( Brown , Marcia , 2002-6-3 ) Попробуем сделать то же самое из сценария DBI: $last = Brown ; $first = Marcia ; $expiration = 2002-6-3 ; $query = qq< INSERT member {last name,first name,expiration) VALUES($last, $first, $expiration) $rows = $dbli->clo ($query); Несмотря на то, что это аналогичный запрос, такая конструкция не работает. В чем дело? Попробуем распечатать получившийся запрос: print $query\n ; Вот результат: INSERT member (last name, firEt name, expiration) VALUES(Brown,Marcia,2002-6-3) Здесь отчетливо видно, что мы забыли заключить в кавычки значения колонок в списке VALUES (). Правильно будет так: $last = $dbli->quote ( Brown ); Sfirst = $dbh->quote ( Marcia ); Sexpiration = $dbh->quote ( 2002-6-3 ); $query = INSERT member (last name, first name, expiration) VALUES($last, Sfirst, Sexpiration) Есть другой метод - создать запрос с использованием маркеров и передавать значения с помощью аргументов метода do (): Slast = Brown ; Sfirst = Marcia ; Sexpiration = 2002-6-3 ; Squery = INSERT member (last name, first name, expiration) VALUES (?,?, ?) Srows = Sdbli->do (Squery, undef, Slast, Sfirst, Sexpiration); К сожалению, в этом случае с помощью оператора print нельзя увидеть, как собственно выглядит полный запрос, потому что маркеры нельзя оценить до запуска метода do (). При использовании маркеров в качестве метода отладки больше подойдет трассировка. Отладка с применением трассировки Для определения, почему интерфейс DBI работает неверно, существует режим генерирования трассировочной (отладочной) информации. Есть десять уровней трассировки от О (выключено) до 9 (максимальное количество информации). Наиболее удобными являются уровни 1 и 2. На втором уровне отображаются выполняемые запросы (включая запросы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |