[interchange] Add new DBI sub, foreign_hash().

Josh Lavin interchange-cvs at icdevgroup.org
Thu Mar 28 22:59:43 UTC 2013


commit 700889a1ad6078fb0ce0cba7bdd4bdf9a3c488ff
Author: Josh Lavin <josh at perusion.com>
Date:   Thu Mar 28 15:52:37 2013 -0700

    Add new DBI sub, foreign_hash().
    
    Basically a row_hash() function that uses a foreign key column instead of primary key. Example:
    
    code     ticket      type
    1234     9876        request
    1233     5555        response
    
    my $rec1 = $db->row_hash('1234');
    my $rec2 = $db->foreign_hash('ticket','9876');
    
    Each of the above would return the same record hash.
    
    Of course the foreign column has to be unique, or an array will be returned.

 lib/Vend/Table/DBI.pm |   34 ++++++++++++++++++++++++++++++++++
 1 files changed, 34 insertions(+), 0 deletions(-)
---
diff --git a/lib/Vend/Table/DBI.pm b/lib/Vend/Table/DBI.pm
index 343c365..10ce8e9 100644
--- a/lib/Vend/Table/DBI.pm
+++ b/lib/Vend/Table/DBI.pm
@@ -1515,6 +1515,40 @@ sub row {
 	return @{ $sth->fetchrow_arrayref() || [] };
 }
 
+sub foreign_hash {
+    my ($s, $col, $key) = @_;
+	$s = $s->import_db() if ! defined $s->[$DBI];
+	my $q = "select * from $s->[$TABLE] where $col = ?";
+    my $sth = $s->[$DBI]->prepare($q)
+		or $s->log_error("%s prepare error for %s: %s", 'row_hash', $q, $DBI::errstr)
+		and return undef;
+    $sth->execute($key)
+		or $s->log_error("%s execute error for %s: %s", 'row_hash', $q, $DBI::errstr)
+		and return undef;
+
+	return $sth->fetchrow_hashref()
+		unless $s->[$TYPE];
+	my $ref;
+	if($s->config('UPPERCASE')) {
+		my $aref = $sth->fetchrow_arrayref()
+			or return undef;
+		$ref = {};
+		my @nm = @{$sth->{NAME}};
+		for ( my $i = 0; $i < @$aref; $i++) {
+			$ref->{$nm[$i]} = $ref->{lc $nm[$i]} = $aref->[$i];
+		}
+	}
+	else {
+		$ref = $sth->fetchrow_hashref();
+	}
+	return $ref unless $s->[$CONFIG]{FIELD_ALIAS};
+	my ($k, $v);
+	while ( ($k, $v) = each %{ $s->[$CONFIG]{FIELD_ALIAS} } ) {
+		$ref->{$v} = $ref->{$k};
+	}
+	return $ref;
+}
+
 sub row_hash {
     my ($s, $key) = @_;
 	$s = $s->import_db() if ! defined $s->[$DBI];



More information about the interchange-cvs mailing list