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

1 ... 112 113 114 [ 115 ] 116 117 118 ... 264


полученные после подстановок), результаты обращений к методу 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++) {



1 ... 112 113 114 [ 115 ] 116 117 118 ... 264

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