|
Программирование >> Программный интерфейс приложений
полученные после подстановок), результаты обращений к методу quote () и т.д. Эту помощь трудно переоценить в решении проблем, возникающих в процессе отладки. Трассировкой можно управлять из отдельного сценария с помощью метода trace () или переменной управления DBI TRACE для установки в режим отладки всех сценариев DBI, которые вами запускаются. Для того чтобы воспользоваться вызовом trace О, необходимо передать аргумент уровня и имя файла. Если имя файла не указано, весь вывод трассировки идет на устройство STDERR; если указано - в указанный файл. Вот некоторые примеры: DBI->trace (1) уровень 1, трассировка производится на устройство STDERR DBI->trace (2, trace.out ) уровень 2, трассировка производит- ся в файл trace.out DBI->trace (0) трассировка выключена При запуске DBI->trace() все операции с интерфейсом DBI трассируются. Более тонкий подход заключается в возможности трассировки на уровне отдельного дескриптора. Такой подход применим, когда известно, в каком месте сценария возникла проблема и вам совсем не нужна регистрация того, что происходит до этой точки. Например, если возникла проблема с запросом SELECT, можно трассировать дескриптор оператора, связанного только с этим запросом: $sth = $dbh->prepare (qq{ SELECT ... }); # Создать дескриптор # оператора $sth->trace (1); # разрешить трассировку оператора $sth->execute (); Если при вызове метода trace () указано имя файла, вся диагностика будет записываться в этот файл. Для того чтобы включить трассировку для всех запущенных вами сценариев DBI, установите переменную среды DBI TRACE из оболочки. Синтаксис полностью зависит от используемой оболочки: % setenv DBI TRACE значение для оболочек csh, tcsh $ DBI TRACE=3Haчение для оболочек sh, ksh, bash $ export DBI TRACE C:\> set ПВ1 ТКАСЕ=значениедля ОС Windows Формат значение для всех оболочек аналогичен: число п для включения трассировки уровня п на устройство STDERR; имя файла для включения трассировки второго уровня в поименованный файл или n=fJle name. Вот несколько примеров с использованием синтаксиса оболочки csh: % setenv DBI TRACE 1 трассировка уровня 1 на устройство STDERR % setenv DBI TRACE l=trace.out трассировка уровня 1 в trace.out % setenv DBI TRACE trace.out трассировка уровня 1 в trace.out Ho, включив режим трассировки, не забудьте отключить его после решения проблемы. Отладочная информация будет добавляться в трасси- Ьовочный файл. В результате этого файл может вырасти до офомных размеров. Категорически нельзя устанавливать dbitrace в стартовом файле .cshrc, .login или .profile! Под ОС UNIX отключить режим фассировки можно с помощью одной из следующих команд (в синтаксисе оболочки csh): % setenv DBI TRACE О % unsetenv DBI TRACE В оболочках sh, ksh или bash сделайте следующее: $ DBI TRACE=0 $ export DBI TRACE В ОС Windows отключить фассировку можно с помощью таких команд: С;\> unset DBI TRACE С:\> set DBI TRACE=0 Метаданные результирующего набора с помощью интерфейса DBI можно получить доступ к метаданным результирующего набора, т.е. к описанию строк, выбранных по запросу. Это будет доступ к афибутам дескриптора оператора, ассоциированного с запросом, генерировавщим этот результат. Некоторые из этих афибу-тов являются стандартными атрибутами интерфейса DBI, доступ к которым можно получить с помощью любого драйвера базы данных (таких как num 0F fields, количество столбцов в результирующем наборе). Другие присущи только MySQL. Их можно получить с помощью драйвера MySQL для интерфейса DBI dbD: :mysql. К числу таких афибутов можно причислить афибут mysql max length, содержащий информацию о максимальной длине значений в каждом столбце. Такие афибуты неприменимы для работы с другими базами данных. Чем больше в сценарии используется афибутов, характерных для работы с СУБД MySQL, тем менее данный сценарий будет переносим на другие базы данных, что позволяет упростить-получение нужной информации. Метаданные нужно запрашивать своевременно. Атрибуты результирующего набора недоступны для оператора select до того момента, пока не запущены методы ргерагеО и execute (). Кроме того, атрибуты могут оказаться ошибочными после запуска метода finish (). Рассмотрим, как можно использовать один из атрибутов метаданных СУБД MySQL mysqlmaxlength одновременно с афибутом уровня DBI name, который хранит имена столбцов запроса. Информацию, полученную от этих атрибутов, можно использовать одновременно. Создадим сценарий boxout, который делает вывод из запросов select в той же манере, в которой работает клиент mysql, работающий в интерактивном режиме. Основное тело сценария boxout имеет следующий вид (здесь оператор select можно заменить любым другим оператором, так как профаммы ввода/вывода не зависят от конкретного запроса): my ($sth) = $dbh->prepare (qq[.{ SELECT last name , first name, city, state FROM president ORDER BY last name, first name )) ; $sth->execute (); # атрибуты становятся доступными # после этого вызова # реальная максимальная ширина столбца в результирующем наборе ту (@wid) @ {$sth->(mysql max length}) ; # число столбцов ту ($ncoIs) = scalar {@wid); # настроить ширину столбцов, # если заголовки стопбцов шире значений данных for (my $i = 0; $i < $ncols; $i++) my ($name wid) = length ($sth->{NAME}->[$i] ) ; $wid[$il = $name wid if $wid[$i] < $name wid; # печать результата print dashes (\(3wid, Sncols); # строка тире print row ($sth->{NAME), \@wid, $ncols); # заголовки столбцов print dashes {\@wid, $ncols); # строка тире while (my ?ary ref = $sth->fetch) { print row (Sary ref, \(awid, Sncols); # строка данных print dashes (\(3wid, Sncolsl; # строка тире $sth->finish 0; Сразу же после инициализации запроса с помошью метода execute О мы можем получить любые нужные нам метаданные. Выражения $sth->{NAME} И $sth->{mysql max length} дают имена столбцов и максимальную длину значения каждого столбца. Значение каждого атрибута является ссылкой на массив, содержащий одно значение для каждого столбца результирующего набора, в порядке их перечисления в запросе. Остальные вычисления очень похожи на аналогичные вычисления, которыми мы воспользовались в главе 6, Профаммный интерфейс MySQL С АРГ . Например, чтобы не допустить неформатированного вывода, можно увеличить ширину столбца, если имя столбца шире значений данных столбца. Функции вывода данных print dashes() и print row() подобны соответствующим кодам в профаммах-клиентах: sub print dashes { my ($wid ary ref ) = shift; # ширина столбца my (Scols) = shift; # число столбцов print + ; for (my $1 = 0; $1 < Scols; $i++) {
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |