summaryrefslogtreecommitdiff
path: root/t/11fetch.t
diff options
context:
space:
mode:
Diffstat (limited to 't/11fetch.t')
-rw-r--r--t/11fetch.t124
1 files changed, 124 insertions, 0 deletions
diff --git a/t/11fetch.t b/t/11fetch.t
new file mode 100644
index 0000000..5f2fedc
--- /dev/null
+++ b/t/11fetch.t
@@ -0,0 +1,124 @@
+#!perl -w
+# vim:ts=8:sw=4
+$|=1;
+
+use strict;
+
+use Test::More;
+use DBI;
+use Storable qw(dclone);
+use Data::Dumper;
+
+$Data::Dumper::Indent = 1;
+$Data::Dumper::Sortkeys = 1;
+$Data::Dumper::Quotekeys = 0;
+
+plan tests => 24;
+
+my $dbh = DBI->connect("dbi:Sponge:foo","","", {
+ PrintError => 0,
+ RaiseError => 1,
+});
+
+my $source_rows = [ # data for DBD::Sponge to return via fetch
+ [ 41, "AAA", 9 ],
+ [ 41, "BBB", 9 ],
+ [ 42, "BBB", undef ],
+ [ 43, "ccc", 7 ],
+ [ 44, "DDD", 6 ],
+];
+
+sub go {
+ my $source = shift || $source_rows;
+ my $sth = $dbh->prepare("foo", {
+ rows => dclone($source),
+ NAME => [ qw(C1 C2 C3) ],
+ });
+ ok($sth->execute(), $DBI::errstr);
+ return $sth;
+}
+
+my($sth, $col0, $col1, $col2, $rows);
+
+# --- fetchrow_arrayref
+# --- fetchrow_array
+# etc etc
+
+# --- fetchall_hashref
+my @fetchall_hashref_results = ( # single keys
+ C1 => {
+ 41 => { C1 => 41, C2 => 'BBB', C3 => 9 },
+ 42 => { C1 => 42, C2 => 'BBB', C3 => undef },
+ 43 => { C1 => 43, C2 => 'ccc', C3 => 7 },
+ 44 => { C1 => 44, C2 => 'DDD', C3 => 6 }
+ },
+ C2 => {
+ AAA => { C1 => 41, C2 => 'AAA', C3 => 9 },
+ BBB => { C1 => 42, C2 => 'BBB', C3 => undef },
+ DDD => { C1 => 44, C2 => 'DDD', C3 => 6 },
+ ccc => { C1 => 43, C2 => 'ccc', C3 => 7 }
+ },
+ [ 'C2' ] => { # single key within arrayref
+ AAA => { C1 => 41, C2 => 'AAA', C3 => 9 },
+ BBB => { C1 => 42, C2 => 'BBB', C3 => undef },
+ DDD => { C1 => 44, C2 => 'DDD', C3 => 6 },
+ ccc => { C1 => 43, C2 => 'ccc', C3 => 7 }
+ },
+);
+push @fetchall_hashref_results, ( # multiple keys
+ [ 'C1', 'C2' ] => {
+ '41' => {
+ AAA => { C1 => '41', C2 => 'AAA', C3 => 9 },
+ BBB => { C1 => '41', C2 => 'BBB', C3 => 9 }
+ },
+ '42' => {
+ BBB => { C1 => '42', C2 => 'BBB', C3 => undef }
+ },
+ '43' => {
+ ccc => { C1 => '43', C2 => 'ccc', C3 => 7 }
+ },
+ '44' => {
+ DDD => { C1 => '44', C2 => 'DDD', C3 => 6 }
+ }
+ },
+);
+
+my %dump;
+
+while (my $keyfield = shift @fetchall_hashref_results) {
+ my $expected = shift @fetchall_hashref_results;
+ my $k = (ref $keyfield) ? "[@$keyfield]" : $keyfield;
+ print "# fetchall_hashref($k)\n";
+ ok($sth = go());
+ my $result = $sth->fetchall_hashref($keyfield);
+ ok($result);
+ is_deeply($result, $expected);
+ # $dump{$k} = dclone $result; # just for adding tests
+}
+
+warn Dumper \%dump if %dump;
+
+# test assignment to NUM_OF_FIELDS automatically alters the row buffer
+$sth = go();
+my $row = $sth->fetchrow_arrayref;
+is scalar @$row, 3;
+is $sth->{NUM_OF_FIELDS}, 3;
+is scalar @{ $sth->_get_fbav }, 3;
+$sth->{NUM_OF_FIELDS} = 4;
+is $sth->{NUM_OF_FIELDS}, 4;
+is scalar @{ $sth->_get_fbav }, 4;
+$sth->{NUM_OF_FIELDS} = 2;
+is $sth->{NUM_OF_FIELDS}, 2;
+is scalar @{ $sth->_get_fbav }, 2;
+
+$sth->finish;
+
+
+if (0) {
+ my @perf = map { [ int($_/100), $_, $_ ] } 0..10000;
+ require Benchmark;
+ Benchmark::timethis(10, sub { go(\@perf)->fetchall_hashref([ 'C1','C2','C3' ]) });
+}
+
+
+1; # end