📄 06attrs.t
字号:
#!perl -wuse strict;use Test::More tests => 137;## ----------------------------------------------------------------------------## 06attrs.t - ...## ----------------------------------------------------------------------------# This test checks the parameters and the values associated with them for # the three different handles (Driver, Database, Statement)## ----------------------------------------------------------------------------BEGIN { use_ok( 'DBI' ) }$|=1;# Connect to the example driver.my $dbh = DBI->connect('dbi:ExampleP:dummy', '', '', { PrintError => 0, RaiseError => 1, });isa_ok( $dbh, 'DBI::db' );# Clean up when we're done.END { $dbh->disconnect if $dbh };## ----------------------------------------------------------------------------# Check the database handle attributes.# bit flag attrok( $dbh->{Warn}, '... checking Warn attribute for dbh');ok( $dbh->{Active}, '... checking Active attribute for dbh');ok( $dbh->{AutoCommit}, '... checking AutoCommit attribute for dbh');ok(!$dbh->{CompatMode}, '... checking CompatMode attribute for dbh');ok(!$dbh->{InactiveDestroy}, '... checking InactiveDestory attribute for dbh');ok(!$dbh->{PrintError}, '... checking PrintError attribute for dbh');ok( $dbh->{PrintWarn}, '... checking PrintWarn attribute for dbh'); # true because of perl -w aboveok( $dbh->{RaiseError}, '... checking RaiseError attribute for dbh');ok(!$dbh->{ShowErrorStatement}, '... checking ShowErrorStatement attribute for dbh');ok(!$dbh->{ChopBlanks}, '... checking ChopBlanks attribute for dbh');ok(!$dbh->{LongTruncOk}, '... checking LongTrunkOk attribute for dbh');ok(!$dbh->{TaintIn}, '... checking TaintIn attribute for dbh');ok(!$dbh->{TaintOut}, '... checking TaintOut attribute for dbh');ok(!$dbh->{Taint}, '... checking Taint attribute for dbh');ok(!$dbh->{Executed}, '... checking Executed attribute for dbh');# other attrcmp_ok($dbh->{ErrCount}, '==', 0, '... checking ErrCount attribute for dbh');SKIP: { skip "Kids and ActiveKids attribute not supported under DBI::PurePerl", 2 if $DBI::PurePerl; cmp_ok($dbh->{Kids}, '==', 0, '... checking Kids attribute for dbh');; cmp_ok($dbh->{ActiveKids}, '==', 0, '... checking ActiveKids attribute for dbh');;}ok(!defined $dbh->{CachedKids}, '... checking CachedKids attribute for dbh');ok(!defined $dbh->{HandleError}, '... checking HandleError attribute for dbh');ok(!defined $dbh->{Profile}, '... checking Profile attribute for dbh');ok(!defined $dbh->{Statement}, '... checking Statement attribute for dbh');ok(!defined $dbh->{RowCacheSize}, '... checking RowCacheSize attribute for dbh');is($dbh->{FetchHashKeyName}, 'NAME', '... checking FetchHashKeyName attribute for dbh');is($dbh->{Name}, 'dummy', '... checking Name attribute for dbh'); # fails for Multiplexcmp_ok($dbh->{TraceLevel}, '==', $DBI::dbi_debug & 0xF, '... checking TraceLevel attribute for dbh');cmp_ok($dbh->{LongReadLen}, '==', 80, '... checking LongReadLen attribute for dbh');# Raise an error.eval { $dbh->do('select foo from foo') };like($@, qr/^DBD::(ExampleP|Multiplex)::db do failed: Unknown field names: foo/ , '... catching exception');ok(defined $dbh->err, '... $dbh->err is undefined');like($dbh->errstr, qr/^Unknown field names: foo\b/, '... checking $dbh->errstr');is($dbh->state, 'S1000', '... checking $dbh->state');ok($dbh->{Executed}, '... checking Executed attribute for dbh'); # even though it failed$dbh->{Executed} = 0; # reset(able)cmp_ok($dbh->{Executed}, '==', 0, '... checking Executed attribute for dbh (after reset)');cmp_ok($dbh->{ErrCount}, '==', 1, '... checking ErrCount attribute for dbh (after error was generated)');## ----------------------------------------------------------------------------# Test the driver handle attributes.my $drh = $dbh->{Driver};isa_ok( $drh, 'DBI::dr' );ok($dbh->err, '... checking $dbh->err');cmp_ok($drh->{ErrCount}, '==', 0, '... checking ErrCount attribute for drh');ok( $drh->{Warn}, '... checking Warn attribute for drh');ok( $drh->{Active}, '... checking Active attribute for drh');ok( $drh->{AutoCommit}, '... checking AutoCommit attribute for drh');ok(!$drh->{CompatMode}, '... checking CompatMode attribute for drh');ok(!$drh->{InactiveDestroy}, '... checking InactiveDestory attribute for drh');ok(!$drh->{PrintError}, '... checking PrintError attribute for drh');ok( $drh->{PrintWarn}, '... checking PrintWarn attribute for drh'); # true because of perl -w aboveok(!$drh->{RaiseError}, '... checking RaiseError attribute for drh');ok(!$drh->{ShowErrorStatement}, '... checking ShowErrorStatement attribute for drh');ok(!$drh->{ChopBlanks}, '... checking ChopBlanks attribute for drh');ok(!$drh->{LongTruncOk}, '... checking LongTrunkOk attribute for drh');ok(!$drh->{TaintIn}, '... checking TaintIn attribute for drh');ok(!$drh->{TaintOut}, '... checking TaintOut attribute for drh');ok(!$drh->{Taint}, '... checking Taint attribute for drh');SKIP: { skip "Executed attribute not supported under DBI::PurePerl", 1 if $DBI::PurePerl; ok($drh->{Executed}, '... checking Executed attribute for drh') # due to the do() above}SKIP: { skip "Kids and ActiveKids attribute not supported under DBI::PurePerl", 2 if ($DBI::PurePerl or $dbh->{mx_handle_list}); cmp_ok($drh->{Kids}, '==', 1, '... checking Kids attribute for drh'); cmp_ok($drh->{ActiveKids}, '==', 1, '... checking ActiveKids attribute for drh');}ok(!defined $drh->{CachedKids}, '... checking CachedKids attribute for drh');ok(!defined $drh->{HandleError}, '... checking HandleError attribute for drh');ok(!defined $drh->{Profile}, '... checking Profile attribute for drh');cmp_ok($drh->{TraceLevel}, '==', $DBI::dbi_debug & 0xF, '... checking TraceLevel attribute for drh');cmp_ok($drh->{LongReadLen}, '==', 80, '... checking LongReadLen attribute for drh');is($drh->{FetchHashKeyName}, 'NAME', '... checking FetchHashKeyName attribute for drh');is($drh->{Name}, 'ExampleP', '... checking Name attribute for drh');## ----------------------------------------------------------------------------# Test the statement handle attributes.# Create a statement handle.my $sth = $dbh->prepare("select ctime, name from ?");isa_ok($sth, "DBI::st");ok(!$sth->{Executed}, '... checking Executed attribute for sth');ok(!$dbh->{Executed}, '... checking Executed attribute for dbh');cmp_ok($sth->{ErrCount}, '==', 0, '... checking ErrCount attribute for sth');# Trigger an exception.eval { $sth->execute("foo") };# we don't check actual opendir error msg because of locale differenceslike($@, qr/^DBD::(ExampleP|Multiplex)::st execute failed: opendir\(foo\): /i, '... checking exception');# Test all of the statement handle attributes.like($sth->errstr, qr/^opendir\(foo\): /, '... checking $sth->errstr');is($sth->state, 'S1000', '... checking $sth->state');ok($sth->{Executed}, '... checking Executed attribute for sth'); # even though it failedok($dbh->{Executed}, '... checking Exceuted attribute for dbh'); # due to $sth->prepare, even though it failedcmp_ok($sth->{ErrCount}, '==', 1, '... checking ErrCount attribute for sth');eval { $sth->{ErrCount} = 42 };like($@, qr/STORE failed:/, '... checking exception');cmp_ok($sth->{ErrCount}, '==', 42 , '... checking ErrCount attribute for sth (after assignment)');$sth->{ErrCount} = 0;cmp_ok($sth->{ErrCount}, '==', 0, '... checking ErrCount attribute for sth (after reset)');# booleansok( $sth->{Warn}, '... checking Warn attribute for sth');ok(!$sth->{Active}, '... checking Active attribute for sth');ok(!$sth->{CompatMode}, '... checking CompatMode attribute for sth');ok(!$sth->{InactiveDestroy}, '... checking InactiveDestroy attribute for sth');ok(!$sth->{PrintError}, '... checking PrintError attribute for sth');ok( $sth->{PrintWarn}, '... checking PrintWarn attribute for sth');ok( $sth->{RaiseError}, '... checking RaiseError attribute for sth');ok(!$sth->{ShowErrorStatement}, '... checking ShowErrorStatement attribute for sth');ok(!$sth->{ChopBlanks}, '... checking ChopBlanks attribute for sth');ok(!$sth->{LongTruncOk}, '... checking LongTrunkOk attribute for sth');ok(!$sth->{TaintIn}, '... checking TaintIn attribute for sth');ok(!$sth->{TaintOut}, '... checking TaintOut attribute for sth');ok(!$sth->{Taint}, '... checking Taint attribute for sth');# common attrSKIP: { skip "Kids and ActiveKids attribute not supported under DBI::PurePerl", 2 if $DBI::PurePerl; cmp_ok($sth->{Kids}, '==', 0, '... checking Kids attribute for sth'); cmp_ok($sth->{ActiveKids}, '==', 0, '... checking ActiveKids attribute for sth');}ok(!defined $sth->{CachedKids}, '... checking CachedKids attribute for sth');ok(!defined $sth->{HandleError}, '... checking HandleError attribute for sth');ok(!defined $sth->{Profile}, '... checking Profile attribute for sth');cmp_ok($sth->{TraceLevel}, '==', $DBI::dbi_debug & 0xF, '... checking TraceLevel attribute for sth');cmp_ok($sth->{LongReadLen}, '==', 80, '... checking LongReadLen attribute for sth');is($sth->{FetchHashKeyName}, 'NAME', '... checking FetchHashKeyName attribute for sth');# sth specific attrok(!defined $sth->{CursorName}, '... checking CursorName attribute for sth');cmp_ok($sth->{NUM_OF_FIELDS}, '==', 2, '... checking NUM_OF_FIELDS attribute for sth');cmp_ok($sth->{NUM_OF_PARAMS}, '==', 1, '... checking NUM_OF_PARAMS attribute for sth');my $name = $sth->{NAME};is(ref($name), 'ARRAY', '... checking type of NAME attribute for sth');cmp_ok(scalar(@{$name}), '==', 2, '... checking number of elements returned');is_deeply($name, ['ctime', 'name' ], '... checking values returned');my $name_lc = $sth->{NAME_lc};is(ref($name_lc), 'ARRAY', '... checking type of NAME_lc attribute for sth');cmp_ok(scalar(@{$name_lc}), '==', 2, '... checking number of elements returned');is_deeply($name_lc, ['ctime', 'name' ], '... checking values returned');my $name_uc = $sth->{NAME_uc};is(ref($name_uc), 'ARRAY', '... checking type of NAME_uc attribute for sth');cmp_ok(scalar(@{$name_uc}), '==', 2, '... checking number of elements returned');is_deeply($name_uc, ['CTIME', 'NAME' ], '... checking values returned');my $nhash = $sth->{NAME_hash};is(ref($nhash), 'HASH', '... checking type of NAME_hash attribute for sth');cmp_ok(scalar(keys(%{$nhash})), '==', 2, '... checking number of keys returned');cmp_ok($nhash->{ctime}, '==', 0, '... checking values returned');cmp_ok($nhash->{name}, '==', 1, '... checking values returned');my $nhash_lc = $sth->{NAME_lc_hash};is(ref($nhash_lc), 'HASH', '... checking type of NAME_lc_hash attribute for sth');cmp_ok(scalar(keys(%{$nhash_lc})), '==', 2, '... checking number of keys returned');cmp_ok($nhash_lc->{ctime}, '==', 0, '... checking values returned');cmp_ok($nhash_lc->{name}, '==', 1, '... checking values returned');my $nhash_uc = $sth->{NAME_uc_hash};is(ref($nhash_uc), 'HASH', '... checking type of NAME_uc_hash attribute for sth');cmp_ok(scalar(keys(%{$nhash_uc})), '==', 2, '... checking number of keys returned');cmp_ok($nhash_uc->{CTIME}, '==', 0, '... checking values returned');cmp_ok($nhash_uc->{NAME}, '==', 1, '... checking values returned');my $type = $sth->{TYPE};is(ref($type), 'ARRAY', '... checking type of TYPE attribute for sth');cmp_ok(scalar(@{$type}), '==', 2, '... checking number of elements returned');is_deeply($type, [ 4, 12 ], '... checking values returned');my $null = $sth->{NULLABLE};is(ref($null), 'ARRAY', '... checking type of NULLABLE attribute for sth');cmp_ok(scalar(@{$null}), '==', 2, '... checking number of elements returned');is_deeply($null, [ 0, 0 ], '... checking values returned');# Should these work? They don't.my $prec = $sth->{PRECISION};is(ref($prec), 'ARRAY', '... checking type of PRECISION attribute for sth');cmp_ok(scalar(@{$prec}), '==', 2, '... checking number of elements returned');is_deeply($prec, [ 10, 1024 ], '... checking values returned'); my $scale = $sth->{SCALE};is(ref($scale), 'ARRAY', '... checking type of SCALE attribute for sth');cmp_ok(scalar(@{$scale}), '==', 2, '... checking number of elements returned');is_deeply($scale, [ 0, 0 ], '... checking values returned');my $params = $sth->{ParamValues};is(ref($params), 'HASH', '... checking type of ParamValues attribute for sth');is($params->{1}, 'foo', '... checking values returned');is($sth->{Statement}, "select ctime, name from ?", '... checking Statement attribute for sth');ok(!defined $sth->{RowsInCache}, '... checking type of RowsInCache attribute for sth');# $h->{TraceLevel} tests are in t/09trace.t1;# end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -