Add single() ro RSC
Peter Rabbitson [Fri, 11 Sep 2009 22:15:50 +0000 (22:15 +0000)]
Changes
lib/DBIx/Class/ResultSetColumn.pm
t/88result_set_column.t

diff --git a/Changes b/Changes
index 42f323f..a0d6efb 100644 (file)
--- a/Changes
+++ b/Changes
@@ -8,9 +8,11 @@ Revision history for DBIx::Class
           dropped during the serial-autodetection rwrite
         - Make sure ResultSetColumn does not depend on the (undefined)
           return value of ->cursor->reset()
+        - Add single() to ResultSetColumn (same semantics as ResultSet)
         - Make sure to turn off IDENTITY_INSERT after insert() on MSSQL
           tables that needed it
         - More informative exception on failing _resolve_relationship
+        - Fix unreported rollback exceptions in TxnScopeGuard
 
 0.08111 2009-09-06 21:58:00 (UTC)
         - The hashref to connection_info now accepts a 'dbh_maker'
index 53b0920..ee1ed04 100644 (file)
@@ -207,6 +207,33 @@ sub first {
   return $row;
 }
 
+=head2 single
+
+=over 4
+
+=item Arguments: none
+
+=item Return Value: $value
+
+=back
+
+Much like L<DBIx::Class::ResultSet/single> fetches one and only one column
+value using the cursor directly. If additional rows are present a warning
+is issued before discarding the cursor.
+
+=cut
+
+sub single {
+  my $self = shift;
+
+  my $attrs = $self->_resultset->_resolved_attrs;
+  my ($row) = $self->_resultset->result_source->storage->select_single(
+    $attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs
+  );
+
+  return $row;
+}
+
 =head2 min
 
 =over 4
index dde817c..c744121 100644 (file)
@@ -1,7 +1,8 @@
 use strict;
-use warnings;  
+use warnings;
 
 use Test::More;
+use Test::Warn;
 use Test::Exception;
 use lib qw(t/lib);
 use DBICTest;
@@ -31,6 +32,10 @@ is($rs_year->next, 1999, "reset okay");
 
 is($rs_year->first, 1999, "first okay");
 
+warnings_exist (sub {
+  is($rs_year->single, 1999, "single okay");
+}, qr/Query returned more than one row/, 'single warned');
+
 # test +select/+as for single column
 my $psrs = $schema->resultset('CD')->search({},
     {