Subject: | Combine rows as elements/attributes. |
Great tool. It's working wonders for me. :)
I was wondering if it is possible to extend the heirarchical grouping (x/y) in column names to include attributes as well? I've added support for this for the RowElement (@id generates <rowelement id="">), but to be complete it would need to be passed down the entire stack (x/@y). I haven't needed that feature yet, so I haven't gotten to it. :)
Thanks,
Jason Pollock
Index: cpan/XML/Generator/DBI.pm
diff -u cpan/XML/Generator/DBI.pm:1.2 cpan/XML/Generator/DBI.pm:1.3
--- cpan/XML/Generator/DBI.pm:1.2 Mon Dec 8 13:29:18 2003
+++ cpan/XML/Generator/DBI.pm Tue Jan 20 14:23:47 2004
@@ -1,4 +1,4 @@
-# $Id: DBI.pm,v 1.2 2003/12/08 00:29:18 jpollock Exp $
+# $Id: DBI.pm,v 1.3 2004/01/20 01:23:47 jpollock Exp $
package XML::Generator::DBI;
use strict;
@@ -110,6 +110,7 @@
# output columns if necessary
$proxy->add_column_info($sth, $names);
+ # Row is actually the set of individual columns in the row.
my @row;
$sth->bind_columns(
\( @row[ 0 .. $#{$names} ] )
@@ -150,7 +151,27 @@
$proxy->send_group($row, $group, $group_by_ind);
- $proxy->send_start($proxy->{RowElement}) if $proxy->{RowElement};
+ # O.k. anything that's preceeded by an @ is an allowed attribute.
+ # Not doing this for stacked elements.
+ my %attribs = map { $names->[$_] => $row->[$_] } # create hash
+ grep { defined $row->[$_] } # remove undef ones
+ grep { $names->[$_] ne $proxy->{GroupBy} } #remove group data
+ grep { $names->[$_] =~ /^@/ } # ensure that the name starts with @
+ (0 .. $#{$names});
+
+ # The only attributes here should be the @'ed ones...
+ foreach my $i (keys(%attribs)) {
+ my $key = $i;
+ $key =~ s/^@//;
+
+ # Store it into the temporary, so that we don't have to worry about it
+ # Really being an @'ed attribute.
+ my $value = $attribs{$i};
+ delete $attribs{$i};
+ $attribs{$key} = $value;
+ }
+
+ $proxy->send_start($proxy->{RowElement}, %attribs) if $proxy->{RowElement};
my @stack;
my @el_stack;
@@ -160,6 +181,11 @@
# skip group element
if ((! defined $row->[$i]) && ($proxy->{ShowNull})) {
$row->[$i] = "";
+ }
+
+ # Skip the attributes.
+ if ($names->[$i] =~ /^@/) {
+ next;
}
if (defined($proxy->{GroupBy}) and $i == $group_by_ind){