[PATCH 05/14] * writing fields containing 0 with AnyData::Format::Fixed (RT#8671) <elodie+cpan [...] pasteur.fr>

"Sven Dowideit" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
From: Sven Dowideit <[email protected]>

---
 AnyData/Format/Fixed.pm |    4 +++-
 Changes                 |    2 +-
 MANIFEST                |    3 +++
 t/fixed.t               |   31 +++++++++++++++++++++++++++++++
 t/fixed.tbl             |    7 +++++++
 t/test.t~               |   40 ----------------------------------------
 6 files changed, 45 insertions(+), 42 deletions(-)
 create mode 100644 t/fixed.t
 create mode 100644 t/fixed.tbl
 delete mode 100755 t/test.t~

diff --git a/AnyData/Format/Fixed.pm b/AnyData/Format/Fixed.pm
index d951c03..afdf03e 100644
--- a/AnyData/Format/Fixed.pm
+++ b/AnyData/Format/Fixed.pm
@@ -31,6 +31,8 @@ package AnyData::Format::Fixed;
 
 This is a parser for fixed length record files.  You must specify an unpack pattern listing the widths of the fields e.g. {pattern=>'A3 A7 A20'}.  You can either supply the column names or let the module get them for you from the first line of the file.  In either case, they should be a comma separated string.
 
+Refer to L<http://perldoc.perl.org/functions/pack.html> for the formating of the pattern.
+
 Please refer to the documentation for AnyData.pm and DBD::AnyData.pm
 for further details.
 
@@ -70,7 +72,7 @@ sub write_fields {
     my @fieldLengths = split /\s+/, $patternStr;
     my $fieldStr = '';
     for(@fields) {
-        next unless $_;
+        next unless defined $_;
         # PAD OR TRUNCATE DATA TO FIT WITHIN FIELD LENGTHS
         my $oldLen = length $_ || 0;
         my $newLen =  $fieldLengths[$fieldNum] || 0;
diff --git a/Changes b/Changes
index 880750a..9593473 100644
--- a/Changes
+++ b/Changes
@@ -10,7 +10,7 @@ version 0.11, released  Aug 2012
  * Fix syntax error in POD documentation (debian) Ansgar Burchardt <[email protected]>
  * Fix spelling errors (debian) Ansgar Burchardt <[email protected]>
  * adColumn $distinct_flag not handled (RT#6248 & RT#6251) John D. Lima
-
+ * writing fields containing 0 with AnyData::Format::Fixed (RT#8671) <elodie+cpan [...] pasteur.fr>
 
 version 0.10, released 19 April 2004
 
diff --git a/MANIFEST b/MANIFEST
index f803a04..7a52d0c 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -23,6 +23,9 @@ AnyData/Storage/PassThru.pm
 AnyData/Storage/RAM.pm
 AnyData/Storage/TiedHash.pm
 t/pod.t
+t/test.t
+t/fixed.t
+t/fixed.tbl
 
 
 
diff --git a/t/fixed.t b/t/fixed.t
new file mode 100644
index 0000000..f2bd342
--- /dev/null
+++ b/t/fixed.t
@@ -0,0 +1,31 @@
+#!/usr/local/bin/perl -wT
+use strict;
+use warnings;
+
+use Test::More;
+plan tests => 6;
+
+use AnyData;
+
+    my $table = adTie( 'Fixed', 't/fixed.tbl', 'r', {pattern=>'A11 A2'} ); 
+
+    ok(6 == adRows($table), "Failed rows");
+    ok('au' eq $table->{'australia'}->{code}, 'select one');
+    ok('ch' eq $table->{'switzerland'}->{code}, 'select another');
+    ok('0' eq $table->{'broken'}->{code}, 'select another');
+    ok(' 0' eq $table->{'broken2'}->{code}, 'select another');
+
+#write test
+    ok(<<'HERE' eq adExport($table, 'Fixed', undef, {pattern=>'A11 A2'}), 'export fixed format');
+country    co
+australia  au
+germany    de
+france     fr
+switzerlandch
+broken     0 
+broken2     0
+HERE
+
+#TODO: note that the docco says the column names need to be comma separated, and the input file has 'country,code', thus the written file would be busted too
+
+__END__
diff --git a/t/fixed.tbl b/t/fixed.tbl
new file mode 100644
index 0000000..02ffb63
--- /dev/null
+++ b/t/fixed.tbl
@@ -0,0 +1,7 @@
+country,code
+australia  au
+germany    de
+france     fr
+switzerlandch
+broken     0
+broken2     0
diff --git a/t/test.t~ b/t/test.t~
deleted file mode 100755
index 30d5abc..0000000
--- a/t/test.t~
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/local/bin/perl -wT
-use strict;
-use warnings;
-
-my @formats = qw(CSV Pipe Tab Fixed Paragraph ARRAY);
-
-use Test::More;
-plan tests => (1+$#formats) * 4;
-
-use AnyData;
-
-
-for my $format( @formats ) {
-   printf  "  %10s ... %s\n", $format, test_ad($format);
-}
-
-sub test_ad {
-    my $file = [];
-    my $format = shift;
-    my $mode = 'o';
-    my $flags = {cols=>'name,country,sex',pattern=>'A5 A8 A3'};
-    my $table = adTie( $format,$file, $mode, $flags ); # create a table
-    $table->{Sue} = {country=>'fr',sex=>'f'};          # insert rows
-    $table->{Tom} = {country=>'fr',sex=>'f'};
-    $table->{Bev} = {country=>'en',sex=>'f'};
-    $table->{{ name=>'Tom'}} = {sex=>'m'};             # update a row
-    delete $table->{Bev};                              # delete a row
-    $flags = {pattern=>'A5 A8 A3'};
-    ok('f' eq $table->{Sue}->{sex}, "Failed single select");
-    my $tstr;
-    while ( my $person = each %$table ) {              # select mulitple rows
-        $tstr .= $person->{name} if $person->{country} eq 'fr';
-    }
-    ok('SueTom' eq $tstr, "Failed multiple select");
-    ok('namecountrysex' eq join('',adNames($table)), "Failed names");
-    ok(2 == adRows($table), "Failed rows");
-}
-
-
-__END__
-- 
1.7.10.4
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.